Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 什么';s是“的正则表达式”;最多三个单词,但不超过20个字符;?_Regex - Fatal编程技术网

Regex 什么';s是“的正则表达式”;最多三个单词,但不超过20个字符;?

Regex 什么';s是“的正则表达式”;最多三个单词,但不超过20个字符;?,regex,Regex,我可以用\s?(\w+\s{0,2}\w*)表示“最多三个单词”,用\w{0,20}表示“不超过二十个字符”,但如何组合这些字符?如前所述,尝试通过前瞻性将两者合并 澄清的一些例子: 早起的鸟儿有虫吃 应按顺序匹配任意三个单词(包括worm*) 这里我们有一个超级资格解释句 “超级资格解释句”的顺序太长,因此不应匹配 *在我的实际用例中,我将使用段落的最后三个单词,即(?:\r)将位于正则表达式的末尾,并且匹配“catch the worm.”)然后在Adobe InDesign中使用“no

我可以用
\s?(\w+\s{0,2}\w*)
表示“最多三个单词”,用
\w{0,20}
表示“不超过二十个字符”,但如何组合这些字符?如前所述,尝试通过前瞻性将两者合并

澄清的一些例子:

早起的鸟儿有虫吃

应按顺序匹配任意三个单词(包括worm*)

这里我们有一个超级资格解释句

“超级资格解释句”的顺序太长,因此不应匹配



*在我的实际用例中,我将使用段落的最后三个单词,即
(?:\r)
将位于正则表达式的末尾,并且匹配“catch the worm.”)然后在Adobe InDesign中使用“no linebreaks”字符样式应用匹配,以避免出现以下情况。

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

\b(?!(?:\s*\w){21})\w+(?:\s+\w+){0,2}(?=$|[\r\n])
看。请注意,在演示中,我使用了
[^\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]
或同等语言。如果regex风格允许,请使用
\p{L}
Unicode类别/属性类。

您在这里使用的是语言吗?如果您使用类似Java的东西,这个问题在IMO中会更容易处理。正则表达式并不是万能的。好吧,试试看,它至少需要1个匹配项word@WiktorStribiżew 6695步骤,情况并非如此performatic@fdfey:好的,在
\b
之后移动前视:。想法基本相同。我可以从你的问题中引出一个PPCG挑战吗?如果运气好的话,会弹出一个同样适用于你问题的答案。不过我花了更长的时间。请看一下,如果可以的话请告诉我。谢谢,看起来不错。我在开始了一个稍微严格的挑战,请随意加入:):)哦:)与整个模式版本的捕获组(以及所有格量词):。是的,因为您正在检查初始单词边界后的整个子字符串是否不超过20个符号(带有
(?!.{21})
),不仅仅是单词字符的数量。这是独立字符串的简化版本。