正则表达式查找包含至少3个特定字符的所有单词

时间:2018-10-29 01:32:32

标签: regex

我正在使用正则表达式解决问题,在该表达式中,我需要找到一个句子中具有至少3个特定字符的所有单词。假设我有以下数据:

定义一种模式,用于选择所有至少包含字符a三倍的单词(包括其大写变体A)。

  

测试的例句是:

     

Anastasia想把香蕉劈开。

所以我要做的是,我已经整理了所有可能遇到的情况:

enter image description here

到目前为止,我已经针对第四种情况和第六种情况使用管道编写了正则表达式,并且适用于给定的文本。

"\\b(\\b[Aa]{1}[^Aa\\W\\s]*[Aa]{1}[^Aa]*[Aa]{1,}\\w*\\b)|(\\b[^Aa\\W]*[Aa]{1}[^Aa\\W]*[Aa]{1}[^Aa\\W]*[Aa]{1,}\\w*\\b)"
  • 我做对了吗?
  • 效率高吗?
  • 正则表达式中是否存在一个允许我计算特定字符的概念?
  • 我在“自动机理论”中了解到NFA / DFA受到限制,无法跟踪计数。那我必须使用先进的图灵机吗?

3 个答案:

答案 0 :(得分:1)

这看起来很令人费解。我认为从单词边界开始并重复包含3个字符(零个或多个非A,非空格字符,后跟单个A字符)的组会更快更容易,然后再添加更多字符,直到您进入下一个空间:

\b(?:[^a ]*a){3}\w*

https://regex101.com/r/ZVxATc/2

(当然,请确保使用不区分大小写的标志,这样您就不必拼写[aA]之类的内容了)

答案 1 :(得分:0)

/^([^a]*a){3}[^a]*$/怎么样。

这将在一个字符串中恰好找到3个a字符。

可以在 here 上看到它运行,我在下面添加了一些测试字符串:

const regex = /^([^a]*a){3}[^a]*$/;
const strings = ['abcabcabc', 'abcabc', 'abcabcabcabc', 'aaa', 'abab', 'ababa', 'a a a', 'a ba ba', 'a ab ab', 'a ab ab ab', 'b ab ab ab'];

for (let i = 0; i < strings.length; i++) {
  console.log(strings[i] + ": " + regex.test(strings[i]));
}

答案 2 :(得分:0)

这是一个使用前瞻性的解决方案:

\b(?=([^ ]*a){3,})\w*\b

它从word boundary,开始,然后创建一个前瞻检查:

零个或多个非空格字符,后跟'a'。重复3次以上。

然后它匹配零个或多个单词字符,最后匹配一个单词边界。

您应该使用“ IgnoreCase”标志。

匹配示例:

abcabcabc香蕉aaa aaabbaa

const regex = /\b(?=([^ ]*a){3,})\w*\b/;
const strings = ['abcabcabc', 'abcabc', 'abcabcabcabc', 'aaa', 'abab', 'ababa', 'a a a', 'a ba ba', 'a ab ab', 'a ab ab ab', 'b ab ab ab'];

for (let i = 0; i < strings.length; i++) {
  console.log(strings[i] + ": " + regex.test(strings[i]));
}