按最长正则表达式匹配子串拆分

时间:2010-11-10 10:25:01

标签: c# regex

任何人都可以告诉我如何找到与给定正则表达式匹配的给定字符串中最长的子字符串?

2 个答案:

答案 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)

循环匹配并比较长度。