这是我之前的问题的后续
我想找到长度为 >的最小N
字符序列,它从单词边界开始,在输入结束时结束。
例如:
N = 5,输入 =“aaa bbb cccc dd” 结果=“cccc dd”
我试过\b.{5,}?$
了,但它匹配整个input
而不是最小的部分。
你regex
有什么建议?
这是我之前的问题的后续
我想找到长度为 >的最小N
字符序列,它从单词边界开始,在输入结束时结束。
例如:
N = 5,输入 =“aaa bbb cccc dd” 结果=“cccc dd”
我试过\b.{5,}?$
了,但它匹配整个input
而不是最小的部分。
你regex
有什么建议?
你只是忘记了比赛周围的括号。采用
.*(\b.{5,}?)$
这次的问题不是贪婪,而是渴望。正则表达式自然会尝试找到最早可能的匹配项,而让它们找到最后一个匹配项可能会很棘手。最简单的方法通常是@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] : "";
此正则表达式不会匹配长度少于五个字符或不包含空格的任何内容。如果这是一个问题,请告诉我,我会调整它。
您可以通过以下方式反转输入
.split("").reverse().join("")
并应用上一个问题的答案,然后使用上述相同的功能反转匹配。
该解决方案不考虑性能。
尝试使用.{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