假设我有一个字符串:cat_dog_ !mouse= <name="Jake_Russell!"> gog+cat我想匹配特定的符号_!=+,但不是在<name="Jake_Russell!">中,这部分正则表达式<name=\".+\">。所以结果应该是__!=+我试过lookAhead:(?!<name=\".+\">)([_!=+])但是结果,它也匹配<name="Jack_Russell!">中的符号。
cat_dog_ !mouse= <name="Jake_Russell!"> gog+cat
_!=+
<name="Jake_Russell!">
<name=\".+\">
__!=+
(?!<name=\".+\">)([_!=+])
<name="Jack_Russell!">
r1wp621o1#
我认为您可以尝试捕获组,将部分<name=\".+\">捕获到1个忽略的组中,并将另一个组用于匹配的特定符号。正则表达式模式:(?<ignored_group><name=".+">)|(?<matched_group>[_!=+])参见演示here
(?<ignored_group><name=".+">)|(?<matched_group>[_!=+])
mitkmikd2#
您可以排除不需要的内容,然后在需要时使用交替和捕获组进行捕获:
<name="[^"]*">|([_!=+])
说明
<name=
"[^"]*"
"..."
>
|
([_!=+])
Regex demo如果可以有多个name=,并且不再出现<和>,则还可以用途:
name=
<
<[^<>]*\bname="[^"]*"[^<>]*>|([_!=+])
Regex demo
w8biq8rn3#
因为不支持可变长度的查找,所以不能排除出现在特定文本之后的匹配项。但是,您可以排除<name后面的匹配项,并排除引号内的匹配项,考虑到正则表达式的限制,这是最好的方法:
<name
(?<!<name)[_!=+](?=(([^"]*"){2})*[^"]*$)
参见live demo。
3条答案
按热度按时间r1wp621o1#
我认为您可以尝试捕获组,将部分
<name=\".+\">
捕获到1个忽略的组中,并将另一个组用于匹配的特定符号。正则表达式模式:
(?<ignored_group><name=".+">)|(?<matched_group>[_!=+])
参见演示here
mitkmikd2#
您可以排除不需要的内容,然后在需要时使用交替和捕获组进行捕获:
说明
<name=
按字面匹配"[^"]*"
取反字符类,匹配"..."
>
按字面匹配|
或([_!=+])
捕获组1,匹配任何列出的字符Regex demo
如果可以有多个
name=
,并且不再出现<
和>
,则还可以用途:Regex demo
w8biq8rn3#
因为不支持可变长度的查找,所以不能排除出现在特定文本之后的匹配项。
但是,您可以排除
<name
后面的匹配项,并排除引号内的匹配项,考虑到正则表达式的限制,这是最好的方法:参见live demo。