regex 单独匹配特定字符(特定表达式中除外)

whlutmcx  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(104)

假设我有一个字符串:
cat_dog_ !mouse= <name="Jake_Russell!"> gog+cat
我想匹配特定的符号_!=+,但不是在<name="Jake_Russell!">中,这部分正则表达式<name=\".+\">。所以结果应该是__!=+
我试过lookAhead:
(?!<name=\".+\">)([_!=+])
但是结果,它也匹配<name="Jack_Russell!">中的符号。

r1wp621o

r1wp621o1#

我认为您可以尝试捕获组,将部分<name=\".+\">捕获到1个忽略的组中,并将另一个组用于匹配的特定符号。
正则表达式模式:(?<ignored_group><name=".+">)|(?<matched_group>[_!=+])
参见演示here

mitkmikd

mitkmikd2#

您可以排除不需要的内容,然后在需要时使用交替和捕获组进行捕获:

<name="[^"]*">|([_!=+])

说明

  • <name=按字面匹配
  • "[^"]*"取反字符类,匹配"..."
  • >按字面匹配
  • |
  • ([_!=+])捕获组1,匹配任何列出的字符

Regex demo
如果可以有多个name=,并且不再出现<>,则还可以用途:

<[^<>]*\bname="[^"]*"[^<>]*>|([_!=+])

Regex demo

w8biq8rn

w8biq8rn3#

因为不支持可变长度的查找,所以不能排除出现在特定文本之后的匹配项。
但是,您可以排除<name后面的匹配项,并排除引号内的匹配项,考虑到正则表达式的限制,这是最好的方法:

(?<!<name)[_!=+](?=(([^"]*"){2})*[^"]*$)

参见live demo

相关问题