如果字符串恰好包含N个字符,则匹配正则表达式

时间:2012-02-16 02:33:11

标签: regex pattern-matching

我想要一个正则表达式来匹配一个字符串,只要它包含一个预定义次数的字符。

例如: 我希望将包含字符“_”的所有字符串匹配3次;

所以 “a_b_c_d”会通过
“a_b”会失败 “a_b_c_d_e”将失败

有人知道一个能满足这个要求的简单正则表达式吗?

谢谢

4 个答案:

答案 0 :(得分: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}[^_]*$

这将正则表达式锚定在字符串的开头并结束,确保其中只有三个“_”出现。

答案 1 :(得分:1)

这应该这样做:

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

答案 2 :(得分:1)

阐述Rado的答案,这是迄今为止最多元化的答案,但如果有更多事件要匹配,可能会很难写:

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

它将匹配整个字符串(从开头^到结尾$),其中正好有3({3})次模式由0或更多({{{{{ 1}}))任何不是下划线(*)和下划线([^_])的字符,除了下划线(_之外的任何字符,整个后面再加0次或更多次)。

当然,也可以将另一种方式分组,因为在我们的例子中,模式是对称的:

[^_]*

答案 3 :(得分:0)

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

a__b_adf
a_b_asfdasdfasfdasdfasf_asdfasfd
___
_a_b_b

这是我的正则表达式。

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