【问题标题】:Regular expression: And condition not working正则表达式:并且条件不起作用
【发布时间】:2016-02-23 19:46:52
【问题描述】:

我正在使用以下正则表达式:

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

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

  1. (条件1):编号后跟ok,然后编号后跟nok。例如:13 ok 1 nok
  2. (条件2):它应该找到ltelidteiflmrj5
  3. 最终的表达式应该是这样的:condition1 and condition2

但是,我的正则表达式在以下句子中找不到任何模式:

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

【问题讨论】:

  • 您似乎正在处理字段由制表符(或多个空格)分隔的记录。在这种情况下,不要使用正则表达式,用空格或制表符分隔记录行,并使用所需的值检查所需的字段。结果会更快。

标签: regex


【解决方案1】:

您错误地使用了前瞻。相反,您可以摆脱它们,只捕获两组之间的文本:

([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。现在,我们从这个位置开始评估原始正则表达式的其余部分。

【讨论】:

  • 我用这个stackoverflow.com/questions/469913/… 来了解正则表达式中的 AND 条件。根据链接,我的正则表达式看起来是正确的。
  • @JohnRambo 用于将同一索引处的两个条件匹配到字符串中。您在 same 索引处没有两个东西,您要查找的字符串位于字符串中的不同位置。
【解决方案2】:

(?=([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

【讨论】:

    【解决方案3】:

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

    (?=([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

    【讨论】:

      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2021-05-27
      • 1970-01-01
      相关资源
      最近更新 更多