正则表达式:条件不起作用

时间:2016-02-23 19:46:52

标签: regex

我使用以下正则表达式:

ok

我的表达式应该找到以下模式:

  1. (条件1):数字后跟nok,然后是数字,后跟13 ok 1 nok。例如:ltelidt
  2. (条件2):应找到eiflmrj5condition1 and condition2
  3. 最终的表达方式应该是这样的:605sd25 schklog_1FS 13 ok 1 nok 106m 24_R23F eiflmrj5 d1us41 fd1d tm1500 o1t2enb1010 2m 2016-02-18 23:30:34 2016-02-19 07:14:01
  4. 但是,我的正则表达式未能在以下句子中找到任何模式:

    {{1}}

3 个答案:

答案 0 :(得分:2)

您未正确使用前瞻。相反,你可以摆脱它们,只是捕获你们两组之间的文本:

([0-9]+\s+ok\s+[0-9]+\s+nok).*?(ltelidt|eiflmrj5)

regex 101上查看匹配。

看起来对前瞻的更好解释会很有用。您可以将它们视为从字符串中的给定位置断言正则表达式。所以,让我们定义字符串abc中的位置:

|a|b|c|
1 2 3 4

您可以看到字符串中有4个位置。现在,尝试应用前瞻(?=b)

|a|b|c|
^
Current position

不配,继续。

|a|b|c|
  ^
  Current position

知道了,我们只是从当前位置匹配,我们得到b。现在,我们从这个位置开始评估原始正则表达式的其余部分。

答案 1 :(得分:1)

(?=([0-9]+\s+ok\s+[0-9]+\s+nok))(?=(ltelidt|eiflmrj5))不可能同时匹配。 也许你可能想要这个:

([0-9]+\s+ok\s+[0-9]+\s+nok).*(ltelidt|eiflmrj5)

这就是说,condition1condition2之间可能存在任何问题。在以下部分中有一个表达方式。

Regular Expression Fiddle

答案 2 :(得分:1)

如果你真的想使用正向前瞻?=,那么你应该使用以下正则表达式:

(?=([0-9]+\s+ok\s+[0-9]+\s+nok)).* (?=(ltelidt|eiflmrj5))

考虑这个正则表达式,q(?=u)它匹配q后面跟u,但没有匹配u部分。积极的先行构造是一对括号,左括号后跟一个问号和一个等号。

您的正则表达式无法正常工作,因为condition2之后condition1没有立即生效。 condition1condition2之间还有其他字符。这就是你必须使用.*

的原因

但是,我建议你不要在你的情况下向前看,因为它不是必需的。

http://www.regular-expressions.info/lookaround.html