求一些C#RegEx帮助

时间:2011-07-09 07:16:04

标签: c# regex

我正在尝试创建一个RegEx表达式,它将成功解析以下行:

"57" "testing123" 82 16 # 13 26 blah blah

我想要的是识别行中的数字。目前,我正在使用的是:

[0-9]+

解析得很好。然而,如果数字是引号,如果数字是“57”或者像“testing123”那样,它变得棘手,我不希望它匹配。

除此之外,哈希符号后面的任何内容('#“),我都不想在哈希符号之后匹配任何内容。

所以在这个例子中,我应该得到的匹配是“82”和“16”。没有别的东西可以匹配。

对此有任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您应该更容易构建3个不同的正则表达式,然后创建组合它们的逻辑:

  1. 检查字符串是否包含#,并忽略其后的所有内容。
  2. 检查“\ d +”的所有匹配,并忽略所有匹配
  3. 检查剩下的所有内容,是否与[0-9] +
  4. 相匹配

答案 1 :(得分:0)

.Net正则表达式可以很容易地解析这个字符串。在注释之前,以下模式应匹配所有内容:

\A      # Start of the string
(?>
    (?<Quoted>  # A quoted string
        ""          # Open quotes
        [^""\\]*            # non quotes or backslashes
        (?:\\.[^""\\]*)*    # but allow escaped characters
        ""          # Close quotes
    )
    |
    (?<Number>  # A number
        \d+         # some digits
    )
    |
    \s+          # Whitespace separator
)*

如果您还想匹配评论,请添加:

(?<Comment>
    \# .*
)?
\z

您可以使用“数字”组的所有捕获信息在一个Match中获取您的数字:

Match parsed = Regex.Match(s, pattern, RegexOptions.IgnorePatternWhitespace);
CaptureCollection numbers = parsed.Groups["Number"].Captures;

缺少此模式主要是不带引号的字符串标记,例如4 8 this 15that,这会增加一些复杂性,具体取决于我们希望它如何工作。