【问题标题】:C# regex to match a string which has a delimiterC# 正则表达式匹配具有分隔符的字符串
【发布时间】:2010-10-13 03:48:08
【问题描述】:

我想使用正则表达式在两个特定单词之间获取包含分隔符的字符串。

例如我需要一个匹配的正则表达式:

Statements1 开始 Statements2 ; Statements3 结束乐趣;

在“开始”和“结束”之间可以多次出现“;”。

语句是多个单词,其中 (.*) 可以在一个单词的正则表达式中使用。

但如果“开始”和“结束”之间没有“;”,则正则表达式不匹配。

另外,“end”应该是“start”之后遇到的第一个“end”

所以,正则表达式不应该匹配

Statements1 start Statements2 end Statements3 ;结束乐趣

我希望匹配为

  1. “开始”之前的陈述
  2. 关键字
  3. “开始”之后的语句

因此,在这种情况下,它将是一个组(对于第一个字符串,因为 2nd 不应该匹配):

  1. 声明1
  2. 开始
  3. 声明2; Statements3 结束乐趣;

【问题讨论】:

    标签: c# regex parsing csv


    【解决方案1】:

    因此,下面的正则表达式将匹配您的肯定情况并失败否定情况并将结果放入第 1、2 和 3 组。

    (.*?) (start) ((?:(?:.*?) ;)+ (?:.*?) end fun)

    如果您不熟悉 (?:) 语法 - 它们表示非捕获括号。 看看Mastering Regular Expressions,这是这个话题的一个很好的参考!

    【讨论】:

    • 是的,我更熟悉 ?: 语法。但我很遗憾地说这个正则表达式不起作用。
    【解决方案2】:
    start ((Statements) ;)+ (Statements) end fun
    

    【讨论】:

    • 这不符合捕获要求
    • 发生这种情况时不是很痛苦!
    【解决方案3】:

    使用起来可能会更快

        string[] Strings = stringToSplit.Split(new char[] { ';' });
        if (Strings.Count() > 1)
        {
            // Do your stuff
        }
    

    【讨论】:

      【解决方案4】:

      听起来你想要的很简单:

      (.*)(start)(.*;.*end.*)
      

      这将返回您列出的组。

      【讨论】:

      • 您的 * 需要非贪婪限定符,否则它将匹配最后一个“结束”,而不是第一个。
      • 你是绝对正确的,虽然替换lazy *s 会导致它对最后的“fun;”进行分组与下一场比赛。不确定这有多重要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多