我想要一个正则表达式来匹配一个字符串,只要它包含一个预定义次数的字符。
例如: 我希望将包含字符“_”的所有字符串匹配3次;
所以
“a_b_c_d”会通过
“a_b”会失败
“a_b_c_d_e”将失败
有人知道一个能满足这个要求的简单正则表达式吗?
谢谢
答案 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