正则表达未来

时间:2015-06-28 06:34:05

标签: regex lookahead

今天,对于一个项目,我试图利用正则表达式,了解群组以及如何使用它们。我正在使用this网站来测试它。问题是每当我编写以下正则表达式时:

  

(?= \ S * \ d)

,该网站给了我一个错误:the expression can match 0 characters and therefore can match infinitely.

虽然这不会引起任何错误:

  

(?= \ S * \ d)(\ S {6,16})

任何人都可以向我解释错误的含义。

1 个答案:

答案 0 :(得分:3)

因为展望是断言,他们不会消耗任何字符。

(?=\S*\d)

当您编写这样的正则表达式时, 检查 ,如果它包含零个或多个非空格后跟一个数字。但是这些字符不会被正则表达式引擎消耗掉。指针保持在同一位置。

示例

 hello123
|
This is the initial position of pointer. It the checking starts from here

hello123
|
(?=\S*\d). Here it matches \S

hello123
 |
 (?=\S*\d)

This continues till

hello123
       |
     (?=\S*\d) Now the assertion is matched. The pointer backtracks to the position from where it started looking for regex.

 hello123
|
Now you have no more pattern to match. For the second version of the regex, the matching then begins from this postion

那么与

有什么不同
(?=\S*\d)(\S{6,16})

下面,

  • (?=\S*\d)这部分进行检查。我再说一遍,这部分不消耗任何字符,只是检查。

  • (\S{6,16})此部分消耗输入字符串中的字符。也就是说,它至少消耗6个非空格字符和最多16个字符。