如何从另一个正则表达式中取反或减去一个正则表达式导致只有一行正则表达式

How to do negate or subtract a regex from another regex result in just one line of regex

我正在尝试做一个正则表达式字符串来查找 swift 中所有强制展开的情况。这将搜索整个代码库中所有带有感叹号的单词。但是,我已经拥有的正则表达式包含了我试图排除的变量的隐式声明。

这是我已有的正则表达式。

(:\s)?\w+(?<!as)\)*!

而且效果很好。它搜索 "variableName!"、“(variableName)!”、"hello.hello!"。强制施法的排除也有效。它避免了像 "hello as! UIView" 这样的情况,但我也试图排除另一种情况,例如带有感叹号的 "var hello: UIView!" 。这就是我遇到的问题。我尝试了负向前瞻和负向后视,但没有解决这种情况。

这是我正在处理的示例正则表达式

(:\s)?\w+(?<!as)\)*!

这是结果

testing.(**test)))!**

Details lists capture **groups!**

hello as! hello

**Hello!**

**testing!**

testing**.test!**

Hello != World

var noNetworkBanner**: StatusBarNotificationBanner!** <-- need to exclude

"var noNetworkBanner**: StatusBarNotificationBanner!**" <-- need to exclude

您可以使用

(?<!:\s)\b\w+(?<!\bas)\b\)*!

我添加了 \b 单词边界以仅匹配整个单词,并将 (:\s)? 可选组更改为否定回顾 (?<!:\s),它不允许 : + space 在你需要匹配的单词之前。

查看 regex demo 和正则表达式图:

详情

  • (?<!:\s) - 如果在当前位置的左侧有一个 : 和一个白色 space
  • ,则匹配失败的否定后视
  • \b - 单词边界
  • \w+ - 1+ 个单词字符
  • (?<!\bas) - 如果在当前位置的左侧有一个完整的单词 as
  • ,则匹配失败的否定后视
  • \b - 单词边界
  • \)* - 0 个或更多 ) 个字符
  • ! - 一个 ! 字符。