【问题标题】:Regex accepting all strings, wronly正则表达式错误地接受所有字符串
【发布时间】:2011-10-24 16:17:06
【问题描述】:

如果它们具有某种格式,我正在尝试子字符串。子字符串正则表达式查询是[CENAOD(xyx)]。我已经完成了以下代码,但是在循环运行时,它说所有结果都匹配,这是错误的。我哪里做错了?

string strRegex = @"(\[CENAOD\((\S|\W)*\)\])*";
string strCenaOd = sReader["intro"].ToString()
if (Regex.IsMatch(strCenaOd, strRegex, RegexOptions.IgnoreCase))
{
      string = (want to read content of ( ) = xyz in example)
}

【问题讨论】:

    标签: c# regex match


    【解决方案1】:

    删除外部( ... )*

    这说明没有匹配也是好的匹配。

    或者使用+ 代替*

    【讨论】:

      【解决方案2】:

      除了@Kent 和@leppie 的答案之外,围绕正则表达式的代码也需要工作。我想这就是你想要的:

      string strRegex = @"\[CENAOD\(([^)]*)\)\]";
      string strCenaOd = sReader["intro"].ToString();
      Match m = Regex.Match(strCenaOd, strRegex, RegexOptions.IgnoreCase);
      if (m.Success)
      {
        string content = m.Groups[1];
        // ...
      }
      

      IsMatch() 是一个简单的是或否检查,它不提供任何方法来检索匹配的文本。

      我特别想从您的正则表达式中评论(\S|\W)*。首先,\S|\W 是匹配任何字符的一种非常低效的方式。 . 通常是你所需要的,但正如 Kent 指出的那样,[^)](即除) 之外的任何字符)在这种情况下更合适。此外,通过将* 放在圆括号外,您将只能捕获最后一个字符。 ([^)]*) 捕获所有这些。更多详情,read this

      【讨论】:

        【解决方案3】:

        如果你说“所有字符串”,那么:

        \[CENAOD\([^\)]*\)\]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多