我有以下数字列表:
[123,45,6,78,9]
[45]
[45,123,456]
[1234,45]
[]
[123,4,67,8,9]
假设我想删除号码45
以尽可能少的回溯删除,我写了以下正则表达式:
(\[)((?=\])|(45(?=\])|45,|(?>([^,]|,(?!45(?:,|\])))))([^\]\])
这个正则表达式适用于除最后一个案例之外的所有案例,任何帮助都将受到赞赏。
答案 0 :(得分:2)
正则表达式:
(?<!\[),45\b|(?<=\[)45,|(?<=\[)45(?=\])
替换字符串:
empty string
它从逗号分隔的字符串中删除数字45。
C#代码将是,
string str = @"[123,45,6,78,9]
[45]
[45,123,456]
[1234,45]
[]
[123,4,67,8,9]";
string result = Regex.Replace(str, @"(?<!\[),45\b|(?<=\[)45,|(?<=\[)45(?=\])", "");
Console.WriteLine(result);
Console.ReadLine();
}
答案 1 :(得分:2)
使用此:
(?<=\[)45,?|,?\b45\b
在C#中:
resultString = Regex.Replace(yourString, @"(?<=\[)45,?|,?\b45\b", "");
在the regex demo中,查看底部的替换。
<强>解释强>
45
更改|
(?<=\[)
断言前面的内容是[
45,?
匹配45和可选的逗号|
,?
匹配可选的逗号\b45\b
答案 2 :(得分:1)
我认为@JleruOHeP会给出一个答案,但我相信最少回溯的正则表达式是他使用的那个,只需稍加调整就可以让它更加无回溯:
@"\b(?:,45|45,?)\b"
对于您的测试用例,上面分别需要16,44,16和46步,如调试器here所示(您需要点击左侧窗格中的&#39; regex调试器&#39;查看每场比赛的步数。)
回溯较低的原因是上述不会使用外观,这会增加一些开销。