2012-02-16 51 views

回答

5

对于你的榜样,你可以这样做:

\b[a-z]*(_[a-z]*){3}[a-z]*\b 

(与忽略大小写标志)。

你可以用它玩here

它说:“匹配0或多个字母,其次是‘_ [A-Z] *’正好三次,其次是0个或多个字母”。 \b的意思是“单词边界”,即“匹配整个单词”。

因为我已经使用'*',所以如果单词中有三个“_”,无论它出现在单词的开始还是结尾,都会匹配 - 否则可以修改它。

此外,我假设你想要匹配一个字符串中的所有单词,其中只有三个“_”。

这意味着字符串“a_b a_b_c_d”会说“a_b_c_d”通过(但“a_b”失败)。

如果你的意思是全球跨越整个字符串你只需要三“_”出现,然后使用:

^[^_]*(_[^_]*){3}[^_]*$ 

此锚定的正则表达式在字符串的开始和去最后,确保其中只有三次出现“_”。

+0

\ B [AZ] *(_ [AZ] *){3} [AZ] * \ b正是我所需要的。大! – Tucker 2012-02-16 02:44:36

+0

请注意,只有当下划线用小写字母字符(即字母)分隔时,这才会起作用。 – 2014-09-23 18:44:10

1

这应做到:

^[^_]*_[^_]*_[^_]*_[^_]*$ 
0

如果你的例子是唯一的可能性(如a_b_c _...),那么其他人都很好,但我写了一个可以处理其他可能性的例子。如:

a__b_adf 
a_b_asfdasdfasfdasdfasf_asdfasfd 
___ 
_a_b_b 

等等

这里是我的正则表达式。

\b(_[^_]*|[^_]*_|_){3}\b 
+0

该解决方案似乎不起作用。 – 2014-09-23 18:35:44

1

在阐述雷达的答案,这是迄今为止最多元,但可能是一个痛苦的,如果有更多的事件来匹配写:

^([^_]*_){3}[^_]*$ 

它将匹配整个字符串(从开始^到端$),其中恰好有3({3})倍包括0个或多个(*)倍的任何字符不被下划线([^_])和一个下划线(_)的图案,整个被后跟0或多个时代的任何特征除了下划线之外([^_]*,再次)。

当然一个可替代基团的其他方式圆形,如在我们的情况下,图案是对称的:

^[^_]*(_[^_]*){3}$ 
相关问题