【问题标题】:Matching comparison operators indefinitely in a string在字符串中无限期匹配比较运算符
【发布时间】:2021-12-28 21:09:03
【问题描述】:

我正在尝试匹配以下模式:

bla bla bla lorem ipsum bla bla email=destiney41@leuschke.org name!=Foo Bar

这是我目前的做法:

(email|name)+\s*(>=|<=|>|<|=|!=)\s*([^ !=<>]+)

因为我总是知道键(电子邮件、姓名),所以第一部分很简单,但我无法将值与空格匹配。我在这里错过了什么?

匹配的结尾应该是新的键 + 运算符组合的开始。

【问题讨论】:

  • 你如何描述/定义一场比赛的结束?
  • “我无法用空格匹配值” 因为您在倒置集 [^ !=&lt;&gt;] 中明确包含了一个空格。如果一个带有空格的值没有被引用或转义,你怎么知道它什么时候结束?
  • 匹配的结尾应该是新的键+操作符组合的开始。
  • 然后试试(email|name)\s*([&gt;&lt;]=?|!?=)\s*(.*?)(?=\s*(?:(?:email|name)\s*(?:[&gt;&lt;]=?|!?=)|$))(见demo)。
  • 完美运行,谢谢。随意提交答案,因为就是这个! :)

标签: php regex pcre


【解决方案1】:

你可以使用

(email|name)\s*([><]=?|!?=)\s*(.*?)(?=\s*(?:(?:email|name)\s*(?:[><]=?|!?=)|$))

或者,如果键必须作为整个单词匹配:

\b(email|name)\s*([><]=?|!?=)\s*(.*?)(?=\s*(?:\b(?:email|name)\s*(?:[><]=?|!?=)|$))

请参阅regex demo详情

  • \b(email|name) - 单词边界和第 1 组捕获 emailname
  • \s* - 零个或多个空格
  • ([&gt;&lt;]=?|!?=) - 第 2 组:&lt;&gt;,然后是可选的 =,或可选的 !,然后是 = 字符
  • \s* - 零个或多个空格
  • (.*?) - 第 3 组:除换行符之外的任何零个或多个字符尽可能少
  • (?=\s*(?:\b(?:email|name)\s*(?:[&gt;&lt;]=?|!?=)|$)) - 一个积极的前瞻,需要(立即在当前位置的右侧):
    • \s* - 零个或多个空格
    • (?: - 非捕获组的开始:
      • \b(?:email|name)\s*(?:[&gt;&lt;]=?|!?=) - emailname 作为一个完整的单词,然后是零个或多个空格,然后是 &lt;&gt;,然后是可选的 =,或可选的 !,然后是 @ 987654346@char
    • | - 或
      • $ - 字符串结束
    • ) - 小组结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2013-09-16
    • 2019-07-25
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多