1

这是我之前的问题的后续

我想找到长度为 >的最小N字符序列,它从单词边界开始,在输入结束时结束。

例如:

N = 5,输入 =“aaa bbb cccc dd”
结果=“cccc dd”

我试过\b.{5,}?$了,但它匹配整个input而不是最小的部分。

regex有什么建议?

4

4 回答 4

3

你只是忘记了比赛周围的括号。采用

.*(\b.{5,}?)$
于 2012-06-28T13:33:50.623 回答
3

这次的问题不是贪婪,而是渴望。正则表达式自然会尝试找到最早可能的匹配项,而让它们找到最后一个匹配项可能会很棘手。最简单的方法通常是@Arcadien 演示的方法:用于.*吞噬整个字符串,然后使用回溯来找到反弹的匹配项。

不过,我对您的要求有一些疑问。 \b可以匹配单词的开头或结尾,因此如果(例如)N=5字符串以 结尾"foo1 bar2",则结果将是" bar2"(注意前导空格)。你真的想要一个从单词末尾开始的匹配,还是应该删除空格或回到开头"foo1"?另外,所有单词都完全由单词字符组成吗?如果有任何非单词字符,\b将能够在更令人惊讶的地方匹配。

对于下面的正则表达式,我将“单词”重新定义为任何完整的非空白字符块。从.*消耗整个字符串开始,然后是前瞻 -(?=.{5,})在它尝试匹配任何内容之前强制它回溯五个位置。强制匹配从单词的\s开头开始,因此正则表达式的其余部分捕获一个或多个完整的单词。

/^.*(?=.{5,})\s(\S+(?:\s+\S+)*$)/

var N = 5;
var regex = "^.*(?=.{" + N + ",})\\s(\\S+(?:\\s+\\S+)*$)";
var match = regex.exec(subject);
var result = (match != null) ? match[1] : "";

此正则表达式不会匹配长度少于五个字符或不包含空格的任何内容。如果这是一个问题,请告诉我,我会调整它。

于 2012-06-28T16:04:02.713 回答
1

您可以通过以下方式反转输入

.split("").reverse().join("")

并应用上一个问题的答案,然后使用上述相同的功能反转匹配。

该解决方案不考虑性能。

于 2012-06-28T13:33:04.133 回答
1

尝试使用.{5}(any character for the next 5 characters) 而不是.{5,}(any character for the next 5 or more characters)

以下使用正则表达式对我有用(由@nhahtdh \w*.{5}$改进)。这将获得所有后跟 5 个字符的单词。

结果:

String "AAAA BBBB CCCC DDEEE"
Match: "DDEEE"

String "AAAA BBBB CCCC DD"
Match: "CCCC DD"

String "AAAA BBBB CCCC"
Match: "BBBB CCCC"

String "AAAA"
Match: null
于 2012-06-28T13:35:24.460 回答