我可以将\s?(\w+\s){0,2}\w*)
用于“最多三个单词”,将\w{0,20}
用于“不超过二十个字符”,但我如何将这些结合起来呢?尝试通过前面提到的here seems to fail来合并两者。
澄清的一些例子:
早起的小鸟捕获了它。
应该按顺序匹配任何三个单词(包括蠕虫 * )。
这里我们有一个supercalifragilisticexpialidocious句子。
“supercalifragilisticexpialidocious句子”序列太长,因此不应该匹配。
* 在我的实际用例中,我要找一个段落的最后三个单词,即(?:\r)
将在RegEx的末尾和 匹配“捕获蠕虫。”)然后在Adobe InDesign中使用“无换行”字符样式应用匹配,以避免orphans。
答案 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类别/属性类。