这是我之前question
的后续内容我想找到长度为>的 minimal 字符序列。 N
,从单词边界开始,在输入结束时结束。
例如:
N = 5, input = "aaa bbb cccc dd" result = "cccc dd"
我尝试了\b.{5,}?$
,但它与整个input
相匹配,而不是 minimal 部分。
你会建议regex
什么?
答案 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