与环视相关的正则表达式

时间:2013-03-16 11:19:26

标签: regex regex-lookarounds

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

  1. 以字母结尾
  2. 以2
  3. 开头

    因此,从"234b342d3"开始,匹配结果应为:
    23(来自234b
    2d(来自2d

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

    我将非常感谢您的回复。

1 个答案:

答案 0 :(得分:0)

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

(?=2.*)表示下一个字符为2,后跟一个或多个字符。但是正则表达式说下一个字符必须是[a-zA-Z],所以没有任何东西可以匹配(因为一个字符不能同时是2[a-zA-Z]

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

  • 不会将前2个字符放在一个组中,以便您可以将其解压缩
  • 贪婪匹配(.*会贪婪地匹配,因此234b342d而不只是234b,而2d将不匹配,因为它已经被前一个覆盖匹配)

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

  • 2后跟一封信不匹配

所以我们需要添加后视来解释这个问题。

最后我们得到:

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

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

(2.)确保以2开头并将前2个字符放在一个组中 (?<=[a-zA-Z])在您的示例中为2d帐户提供了支持(2后跟一封信) .*?是非贪婪匹配的 [a-zA-Z] - 表示以字符结尾