任何人都可以告诉我如何找到与给定正则表达式匹配的给定字符串中最长的子字符串?
答案 0 :(得分:6)
通常,正则表达式引擎会在字符串中找到最左边,最长的匹配项(除非您明确告诉它不要)。
因此正则表达式X+
将始终与XXXXX
中的testXXXXX.
匹配。
但是,如果字符串中存在多个潜在匹配项,则标准find
方法将始终找到第一个匹配项,而不一定是最长匹配项(例如,在test1XXtest2XXXXX.
中)。要在此处找到最长匹配项,您需要使用正则表达式引擎的findall
方法,然后测量所有匹配项的长度。
在C#中,这可能如下所示:
StringCollection resultList = new StringCollection();
Regex regexObj = new Regex("[ ]+");
Match matchResult = regexObj.Match(subjectString);
while (matchResult.Success) {
resultList.Add(matchResult.Value);
matchResult = matchResult.NextMatch();
}
(之后,找到resultList
中最长的字符串。)
但是,如果潜在的匹配可能会重叠,则会出现问题。以正则表达式为例
AB+A
和字符串
ABABBA
如果你应用正则表达式,你只会找到ABA
因为正则表达式引擎在第一次匹配后消耗了第二个A
,所以它开始第二次尝试B
BBA
然后失败了。这是“最左边最长”行为的结果,如果你想绕过它,你必须将“正则表达式”“手动”重新应用到整个字符串,然后重新应用到整个字符串减去第一个字符,然后再到整个字符串减去前两个字符等。
答案 1 :(得分:0)
循环匹配并比较长度。