1

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

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

(:\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
4

1 回答 1

0

您可以使用

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

我添加了\b单词边界以仅匹配整个单词,并将(:\s)?可选组更改为否定的lookbehind, (?<!:\s),这不允许:在您需要匹配的单词之前使用 + 空格。

请参阅正则表达式演示和正则表达式图:

在此处输入图像描述

细节

  • (?<!:\s)- 如果在当前位置的左侧紧邻有 a:和一个空格,则匹配失败
  • \b- 单词边界
  • \w+- 1+字字符
  • (?<!\bas)- 如果紧靠当前位置的左侧有一个完整的单词,则匹配失败的否定后向查找as
  • \b- 单词边界
  • \)*- 0 个或更多)字符
  • !- 一个!字符。
于 2019-06-11T07:32:07.173 回答