如何匹配JavaScript中输入结尾的最小模式?

时间:2012-06-28 13:26:44

标签: javascript regex

这是我之前question

的后续内容

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

例如:

N = 5, input = "aaa bbb cccc dd"
result = "cccc dd"

我尝试了\b.{5,}?$,但它与整个input相匹配,而不是 minimal 部分。

你会建议regex什么?

4 个答案:

答案 0 :(得分:3)

你刚刚忘记了比赛中的括号。使用

.*(\b.{5,}?)$

答案 1 :(得分:3)

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

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

对于下面的正则表达式,我重新定义了“word”来表示任何完整的非空白字符块。 .*以消耗整个字符串开始,然后前瞻 - (?=.{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] : "";

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

答案 2 :(得分:1)

您可以通过

反转输入
.split("").reverse().join("")

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

此解决方案不考虑性能。

答案 3 :(得分:1)

尝试使用.{5}(接下来的5个字符的任何字符)而不是.{5,}(接下来的5个或更多字符的任何字符)

以下使用regexpal \w*.{5}$(由@nhahtdh改进)为我工作。 这将获得所有后跟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