1

设计一个正则表达式来提取子字符串的前两位数字:

  1. 以字母结尾
  2. 从 2 开始

所以 from "234b342d3",匹配结果应该是:
23(from 234b)
2d(from 2d)

我的大致答案是"(?=1.*)[a-zA-Z]",但看起来它不起作用。

我会感谢你的每一个回复。

4

1 回答 1

0

我假设你的意思是(?=2.*)...

(?=2.*)表示下一个字符2后跟一个或多个任何内容。但是然后正则表达式说下一个字符必须是[a-zA-Z],所以什么都不会匹​​配(因为一个字符不能2同时[a-zA-Z]是。

仅删除前瞻 ( 2.*[a-zA-Z]) 是朝着正确方向迈出的一步,但以下内容仍然是错误的:

  • 不会将前 2 个字符放在一个组中,以便您可以提取它
  • 贪婪匹配(.*将贪婪匹配,所以234b342d而不是只是234b, 并且2d不会匹配,因为它已经被上一个匹配覆盖了)

因此,将前 2 个字符放在括号中以将其放在一个组中并添加非贪婪匹配(.*?而不是.*)((2.).*?[a-zA-Z])。但现在:

  • 2 后跟一个字母不匹配

所以我们需要添加look-behind来解决这个问题。

所以最后我们得到:

(2.)((?<=[a-zA-Z])|.*?[a-zA-Z])

然后提取第一组(如何做到这一点取决于语言)。

(2.)确保它以 2 开头并将前 2 个字符放在一个组中。在您的示例中
(?<=[a-zA-Z])向后考虑(a后跟一个字母)是非贪婪匹配- 意味着以一个字符结尾2d2
.*?
[a-zA-Z]

于 2013-03-16T12:55:41.350 回答