【问题标题】:Remove a Number from List of Comma-Separated Numbers从逗号分隔的数字列表中删除一个数字
【发布时间】:2014-09-11 13:24:36
【问题描述】:

我有一个如下数字列表:

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

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

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

此正则表达式适用于除最后一种情况以外的所有情况,我们将不胜感激。

【问题讨论】:

  • 最后一个case是什么意思?
  • 预期的输出是什么?
  • 那个正则表达式无效 - 有一些未闭合的括号和方括号 - 你能检查一下吗?
  • 您是否必须考虑方括号外可能存在45s 以及正则表达式不能匹配这些的可能性?
  • 如果您不关心括号,那么最简单的方法是:Regex.Replace(str, "\\b(45,|45|,45)\\b", "");

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


【解决方案1】:

使用这个:

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

在 C# 中:

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

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

说明

  • 我们在两种情况下匹配 45,在 | 交替的两侧
  • 在左侧,后面的 (?&lt;=\[) 断言前面是 [
  • 45,? 匹配 45 和可选的逗号
  • |
  • ,? 匹配可选逗号
  • \b45\b 在单词边界内

【讨论】:

  • 空壳[]或者不包含45的情况呢?
  • @babbupandey:那么正则表达式什么也不做。你为什么不测试一下?他甚至提供了一个测试链接……
  • 我接受了它作为答案,尽管@AvinashRaj 的答案也是正确的,这是一个简洁的答案:) 谢谢你的帮助,你们太棒了!!
【解决方案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

【讨论】:

  • 如您的演示所示,它无法从[45] 中删除45
【解决方案3】:

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

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

对于您的测试用例,上面分别需要 16、44、16 和 46 个步骤,如在调试器 here 上所见(您需要单击左侧窗格中的“正则表达式调试器”以查看步骤数)每场比赛)。

回溯较低的原因是上面没有使用环视,这增加了一些开销。

【讨论】:

  • 哦哇!谢谢杰里
  • @babbupandey 我的荣幸 :)
猜你喜欢
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2017-04-10
相关资源
最近更新 更多