从逗号分隔数列表中删除一个数字

时间:2014-07-21 05:38:08

标签: c# .net regex regex-negation regex-lookarounds

我有以下数字列表:

[123,45,6,78,9]
[45]
[45,123,456]
[1234,45]
[]
[123,4,67,8,9]

假设我想删除号码45以尽可能少的回溯删除,我写了以下正则表达式:

(\[)((?=\])|(45(?=\])|45,|(?>([^,]|,(?!45(?:,|\])))))([^\]\])

这个正则表达式适用于除最后一个案例之外的所有案例,任何帮助都将受到赞赏。

3 个答案:

答案 0 :(得分:2)

正则表达式:

(?<!\[),45\b|(?<=\[)45,|(?<=\[)45(?=\])

替换字符串:

empty string

DEMO

它从逗号分隔的字符串中删除数字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();
}

IDEONE

答案 1 :(得分:2)

使用此:

(?<=\[)45,?|,?\b45\b

在C#中:

resultString = Regex.Replace(yourString, @"(?<=\[)45,?|,?\b45\b", "");

the regex demo中,查看底部的替换。

<强>解释

  • 我们在45更改
  • 两侧的两种情况下匹配|
  • 在左侧,lookbehind (?<=\[)断言前面的内容是[
  • 45,?匹配45和可选的逗号
  • |
  • ,?匹配可选的逗号
  • 在文字边界内
  • \b45\b

答案 2 :(得分:1)

我认为@JleruOHeP会给出一个答案,但我相信最少回溯的正则表达式是他使用的那个,只需稍加调整就可以让它更加无回溯:

@"\b(?:,45|45,?)\b"

对于您的测试用例,上面分别需要16,44,16和46步,如调试器here所示(您需要点击左侧窗格中的&#39; regex调试器&#39;查看每场比赛的步数。)

回溯较低的原因是上述不会使用外观,这会增加一些开销。