什么是“最多三个字但不超过20个字符”的RegEx?

时间:2016-05-18 14:26:48

标签: regex

我可以将\s?(\w+\s){0,2}\w*)用于“最多三个单词”,将\w{0,20}用于“不超过二十个字符”,但我如何将这些结合起来呢?尝试通过前面提到的here seems to fail来合并两者。

澄清的一些例子:

  

早起的小鸟捕获了它。

应该按顺序匹配任何三个单词(包括蠕虫 * )。

  

这里我们有一个supercalifragilisticexpialidocious句子。

“supercalifragilisticexpialidocious句子”序列太长,因此不应该匹配。

* 在我的实际用例中,我要找一个段落的最后三个单词,即(?:\r)将在RegEx的末尾和 匹配“捕获蠕虫。”)然后在Adobe InDesign中使用“无换行”字符样式应用匹配,以避免orphans

1 个答案:

答案 0 :(得分:1)

要匹配在行或字符串末尾用空格分隔的3个单词,您可以使用

\b(?!(?:\s*\w){21})\w+(?:\s+\w+){0,2}(?=$|[\r\n])

请参阅regex demo。请注意,在演示中,我使用[^\S\r\n]而不是前瞻中的\s,因为文本包含换行符,如果需要,请使用相同的技巧。

正则表达式解释

  • \b - 字边界
  • (?!(?:\s*\w){21}) - 如果在初始单词边界之后有21个单词字符可选地前面带有任意数量的空白符号,则前瞻检查会使匹配失败
  • \w+ - 1个单词(由1个或多个单词字符组成)
  • (?:\s+\w+){0,2} - 零个,一个或两个1+空格序列,后跟1个字符
  • (?=$|[\r\n]) - 一个积极的预测,只有在字符串结尾($)或行尾([\r\n])时才允许返回匹配。

现在,如果您的文字只包含字母,请使用[a-zA-Z]或等效语言。如果正则表达式允许,请使用\p{L} Unicode类别/属性类。