【问题标题】:c#: remove brackets of certain size if existing including its content [duplicate]c#:删除一定大小的括号,如果存在,包括其内容[重复]
【发布时间】:2019-07-31 20:28:30
【问题描述】:

我想从一个巨大的数据库中提取字符串。有时(并非总是)这些字符串末尾包含一种序列号,我想将其删除。序列号始终具有相同的外观,例如:

string text = "176 - monoring_01 (xktz) (bd685448-c2cf-4433-az87-8ebc9be5ae56)"

我想只获取“176 - monoring_01 (xktz)”部分并删除包括括号在内的序列号。

我正在使用 Visual Studio 2017。

这就是我尝试过的:

if (text.Contains(@" ?\(.{36}\)"))                                
            {                                                                       
               text_m = Regex.Replace(text, @" ?\(.*?\)", string.Empty);  
            else
            {                                                                       
                text_m =text;                                             
            }                       

但我总是得到完整的字符串。所以,我尝试了:

Console.WriteLine(text.Contains(@" ?\(.{36}\)"));

确实输出为“假”,因此它无法识别 36 位数字之间的括号。 这里有什么问题?

【问题讨论】:

  • Contains 不使用正则表达式,你应该使用 Regex.IsMatch()
  • 另外,我建议您在替换中使用与您在比赛中使用的相同的正则表达式,否则您可能会感到惊讶;)。顺便说一句,您不需要使用 if 进行测试,如果不匹配,regex.Replace 将不会替换任何内容
  • string.Contains 不接受正则表达式,请使用 Regex.IsMatch(string, pattern)

标签: c# regex


【解决方案1】:

1) string.Contains() 不使用正则表达式(这就是您发现结果令人困惑的原因)

2) if 测试甚至没有必要,Regex.Replace 将仅替换匹配项。如果不匹配,则不替换。

因此,您可以使用以下代码更改所有代码块:

text_m = Regex.Replace(text, @" ?\(.{36}\)", string.Empty);  

如果您的字符串变得更加多样化,我什至会编写一个限制性稍强的正则表达式:@" ?\([^\(\)]{36}\)"(不允许在匹配的括号内使用任何括号!),就像一个安全网。

【讨论】:

    【解决方案2】:

    你可以使用 regex.Match 例如

      text = text.Replace(System.Text.RegularExpressions.Regex.Match(text, @" ?\(.{36}\)").ToString(), "");
    

    输出

    176 - monoring_01 (xktz)
    

    【讨论】:

      【解决方案3】:

      如果确实所有记录的模式相同,例如 1 个空格和括号内的序列,您可以使用 LastIndexOfSubstring 方法。类似的东西:

      string text = "176 - monoring_01 (xktz) (bd685448-c2cf-4433-az87-8ebc9be5ae56)";
      var index = text.LastIndexOf("(");
      string result = text.Substring(0, index);
      

      【讨论】:

        【解决方案4】:

        如果您的序列始终位于末尾,长度为 36-cgars-long 并且在括号之间,则以下内容将起作用:

        str = str.Trim();
        
        bool containsSerial = str[str.Length-1] == ')' && str[str.Length-38] == '(';
        
        if (containsSerial)
            str = str.Substring(0, str.Length - 38);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-11
          • 1970-01-01
          • 1970-01-01
          • 2021-10-22
          • 2017-05-06
          • 2018-05-28
          • 2023-03-21
          • 2020-06-12
          相关资源
          最近更新 更多