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