正则表达式匹配子字符串,但不包含单词

时间:2014-11-11 15:13:45

标签: regex

我希望能够使用正则表达式来匹配给定的字符串,但不能使用包含它的特定长字。这是一个更好解释的例子:

鉴于文字:

String bellsringing = "The bells are ringing is a String";

我希望能够找到所有“ring”的出现,这些不是单词String的一部分,不仅限于单词(可以出现在单词中)。 所以答案只会是“铃声响起”和“响铃”。

我知道程序可以用于这样的任务,但是我已经满足了在大型库中查找特定字符串的需要,如果搜索到的字符串是普通关键字/文字的子字符串,我有很多挖掘做,并将从IDE使用正则表达式函数搜索中受益:)

感谢您提供任何意见。

3 个答案:

答案 0 :(得分:3)

PCRE(Perl兼容正则表达式)

如果你使用PCRE正则表达式,那么你可以使用这样的正则表达式:

String(*SKIP)(*FAIL)|ring

<强> Working demo

enter image description here

这个正则表达式的想法是失败string模式,所以它会跳过它但会保留ring。顺便说一句,如果你想获得完整的单词,你可以使用这个正则表达式:

String(*SKIP)(*FAIL)|(\w*ring\w*)

比赛信息是:

MATCH 1
1.  [14-21] `ringing`
MATCH 2
1.  [64-71] `ringing`

其他引擎

另一方面,如果你没有使用PCRE,你可以利用丢弃模式,这是一个非常好的正则表达技巧:

String|(\w*ring\w*)

<强> Working demo

enter image description here

在这种情况下,您所做的是匹配模式左侧不想要的内容,同时在最正确的部分保持您想要的 < strong>使用群组。丢弃模式遵循以下规则:

discard patt1 | discard patt2 | ... | discard pattN | (KEEP THIS PATTERN)

然后,您必须访问正则表达式组\1$1才能获取已保存的字符串。对于这种情况是:

MATCH 1
1.  [14-21] `ringing`
MATCH 2
1.  [64-71] `ringing`

Debuggex以图形方式显示这项技术做得很好:

Regular expression visualization

答案 1 :(得分:2)

建立@Fede的答案,使用否定的预测:

\b(?!String)\w*ring\w*\b

这将从单词边界开始,确保它找不到String,然后匹配ring

Working example

答案 2 :(得分:0)

String|\b(\w*?ring\w*)\b

试试这个。抓住捕获。见demo.Apply i标志。

http://regex101.com/r/tF5fT5/39