在字符串中无限匹配比较运算符

Matching comparison operators indefinitely in a string

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

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

这是我目前的做法:

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

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

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

你可以使用

(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* - 零个或多个空格
  • ([><]=?|!?=) - 第 2 组:<>,然后是可选的 =,或可选的 !,然后是 = 字符
  • \s* - 零个或多个空格
  • (.*?) - 第 3 组:除换行字符外的任何零个或多个字符尽可能少
  • (?=\s*(?:\b(?:email|name)\s*(?:[><]=?|!?=)|$)) - 正向前瞻需要(紧靠当前位置的右侧):
    • \s* - 零个或多个空格
    • (?: - 非捕获组的开始:
      • \b(?:email|name)\s*(?:[><]=?|!?=) - emailname 作为一个完整的单词,然后是零个或多个空格,然后是 <>,然后是一个可选 =,或可选 !,然后是 = char
    • | - 或者
      • $ - 字符串结尾
    • ) - 小组结束。