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

Mig*_*uel 1 c# regex

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

Tim*_*ker 6

通常,正则表达式引擎会在字符串中找到最左边,最长的匹配(除非您明确告诉它不要).

因此,正则表达式X+将总是匹配XXXXXtestXXXXX..

但是,如果字符串中存在多个潜在匹配项,则标准find方法将始终找到第一个匹配项,而不一定是最长匹配项(例如,in 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();
} 
Run Code Online (Sandbox Code Playgroud)

(之后,找到最长的字符串resultList.)

但是,如果潜在匹配可能重叠,则存在问题.以正则表达式为例

AB+A
Run Code Online (Sandbox Code Playgroud)

和字符串

ABABBA
Run Code Online (Sandbox Code Playgroud)

如果你应用正则表达式,你只能找到ABA因为正则表达式引擎A在第一次匹配后消耗了第二次,所以它开始第二次尝试,当然BBBA失败.这是"最左边最长"行为的结果,如果你想绕过它,你必须将"正则表达式""手动"重新应用到整个字符串,然后重新应用到整个字符串减去第一个字符,然后再到整个字符串减去前两个字符等