正则表达式匹配特定的语法

时间:2011-03-22 16:01:11

标签: .net regex parsing match

嗨我想要一个正则表达式模式来匹配一个非常具体的字符串语法。下面是我放在一起的Pattern字符串;它在某些情况下有效但在其他情况下无效,我很确定它过于复杂:

\[\CONTENT\((?:(?:(?:(\w+) ?= ?((?:"(?:[^"]+)")|(?:'(?:[^']+)')|(?:(?:[^"',]+))) ?, ?)+(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))|(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))\)]

我想要匹配的字符串语法如下:

[CONTENT(Name="value, Name2='value2', Name_3 = value3, Name4= "value 4 \" includes an escaped quote")] etc

我要返回的匹配组如下

Match Group 1 - Match 1: [CONTENT(Name="value", Name2='value2', Name_3 = value3, Name4= "value 4 \" includes an escaped quote")]

Match Group 2 - Match 1: Name="value"
Match Group 2 - Match 2: Name
Match Group 2 - Match 3: value

Match Group 3 - Match 1: Name2='value'
Match Group 3 - Match 2: Name2
Match Group 3 - Match 3: value2

Match Group 4- Match 1: Name_3 = value3
Match Group 4- Match 2: Name_3
Match Group 4- Match 3: value3

Match Group 5 - Match 1: Name4= "value 4 \" includes an escaped quote"
Match Group 5 - Match 2: Name4
Match Group 5 - Match 3: value 4 \" includes an escaped quote

当我提到匹配组时,我指的是.NET中的匹配组。结果不一定如上所述,但如果可能的话也是如此。

我对简单的正则表达式非常好,但是我无法理解周围的情况等。“名称=值”集可以重复多次(可能,但不太可能无限次),每次都用','分隔(逗号) - 除了最后一组(姓氏/值集后面不会跟','(逗号))。 '='(等号)符号(或不符号)的任何一侧以及','(逗号)的任何一侧都可以有空格。

我不知道这对于Regex来说是不是太复杂了或者是什么(如果我对任何人都可以作为解决这样一个字符串的替代方案的任何建议持开放态度。)

感谢任何人提供的任何帮助。

克里斯

2 个答案:

答案 0 :(得分:1)

...假设

  1. 必须至少有一个属性/值对。 AND
  2. 每个attrib / value对由一个逗号和可选空格分隔。 AND
  3. 每个属性值都是正确引用的字符串或单个“单词”。 AND
  4. 引用的属性值字符串可能包含转义字符:(例如v1="That's not \"MY\" problem!"和/或v2='That\'s not "MY" problem!')。 AND
  5. 属性名称或不带引号的值“word”仅由alphanum和破折号组成(即[A-Za-z0-9_\-]+)。 (请注意,原始问题并未明确定义此要求。)
  6. 然后这个正则表达式(在C#中)将正确匹配[CONTENT(a1=v1, a2=v2...)]结构:

    Regex regexObj = new Regex(
        @"# Match a [CONTENT(a1=v1, a2=v2...)] structure.
        \[CONTENT\(\s*                  # Opening delimiter
        # Match required first attrib/value pair.
        [\w\-]+                         # First attrib name (Allow [A-Z-a-z0-9_-].
        \s*=\s*                         # Name and value separated by =.
        (?:                             # Group value spec alternatives.
          ""[^""\\]*(\\.[^""\\]*)*""    # Either double quoted string,
        | '[^'\\]*(\\.[^'\\]*)*'        # or a single quoted string,
        |  [\w\-]+                      # or single unquoted ""word"".
        )                               # End group for value alternatives.
        # Match optional second, third... attrib/value pairs.
        (?:                             # Group to allow optional pairs.
          \s*,\s*                       # All pairs separated by comma.
          [\w\-]+                       # Attrib name.
          \s*=\s*                       # Name and value separated by =.
          (?:                           # Group value spec alternatives.
            ""[^""\\]*(\\.[^""\\]*)*""  # Either double quoted string,
          | '[^'\\]*(\\.[^'\\]*)*'      # or a single quoted string,
          |  [\w\-]+                    # or single unquoted ""word"".
          )                             # End group for value alternatives.
        )*                              # Zero or more optional A=V pairs.
        \s*\)\]                         # Closing delimiter.", 
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
    

    匹配并捕获单个[CONTENT(...)]结构后,您可以使用另一个匹配每个atrib / value对的正则表达式将其分开,一次一个。

    为了善良,在编写像这样的非平凡正则表达式时,总是使用自由间距模式并添加注释和缩进!

答案 1 :(得分:0)

肯定不是正则表达式。使用适当的解析器 - 使用C#中的解析组合器很容易实现递归下降解析器。例如,请参阅thisthis