.net 正则表达式以匹配特定语法

.net 正则表达式以匹配特定语法,.net,regex,parsing,match,.net,Regex,Parsing,Match,嗨,我想要一个正则表达式模式来匹配一个非常特定的字符串语法。下面是我组合的模式字符串;它在某些情况下有效,但在其他情况下不起作用,我很确定它过于复杂: \[\CONTENT\((?:(?:(?:(\w+) ?= ?((?:"(?:[^"]+)")|(?:'(?:[^']+)')|(?:(?:[^"',]+))) ?, ?)+(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))|(?:(?:\w+) ?= ?(?:(?:"(?

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

\[\CONTENT\((?:(?:(?:(\w+) ?= ?((?:"(?:[^"]+)")|(?:'(?:[^']+)')|(?:(?:[^"',]+))) ?, ?)+(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))|(?:(?:\w+) ?= ?(?:(?:"(?:.+)")|(?:'(?:.+)')|(?:(?:[^"',]+)))))\)] \(3)以下以下以下几种:(:(:(以下以下以下以下以下以下以下以下以下以下以下几种:(:(以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下:(:(:(:(以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下几种:(:(:(:(:(:(::::::::::)))))))以下以下以下以下以下以下,(,(,(:(:(:(:(:(:(:(以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下以下)将将将将将将将将)的)))))将将:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:(:((?:(?:[^“',]+щщщ)\)] 我尝试匹配的字符串语法如下:

[CONTENT(Name="value, Name2='value2', Name_3 = value3, Name4= "value 4 \" includes an escaped quote")] etc [内容(Name=“value,Name2='value2',Name_3=value3,Name4=“value 4\”包括转义引号”)等] 我想要返回的匹配组如下

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 匹配组1-匹配1:[内容(Name=“value”,Name2=“value2”,Name\u 3=value3,Name4=“value 4\”包括转义引号]] 匹配组2-匹配1:Name=“value” 匹配组2-匹配2:名称 匹配组2-匹配3:值 匹配组3-匹配1:Name2='value' 第三组比赛-第二组:姓名2 匹配组3-匹配3:值2 匹配组4-匹配1:Name_3=value3 匹配组4-匹配2:名称\u 3 匹配组4-匹配3:值3 匹配组5-匹配1:Name4=“value 4\”包含转义引号 第五组比赛-第二组:名称4 匹配组5-匹配3:值4\“包含转义引号 当我提到匹配组时,我指的是.NET中的匹配组。结果不必如上所述,如果可能的话,结果应该相似

我对简单的正则表达式很在行,但我不能四处看看。这些“Name=Value”集合可以重复无数次(可能,但不太可能无限次),每一次都用一个“,”(逗号)分隔——除了最后一个集合(姓/值集合后面不会跟一个“,”(逗号))。在“=”(等于)的两边都可以有空格符号(或非符号)以及“,”的任一侧(逗号)

我不知道这是否太复杂,无法处理Regex或其他什么(如果是,我愿意接受任何人提出的关于如何解析此类字符串的建议)

谢谢任何人能提供的帮助


Chris

这当然不适用于正则表达式。请改用合适的解析器-使用C#中的解析组合器实现递归下降解析器非常容易。例如,请参阅或。

假设

  • 必须至少有一个属性/值对。和
  • 每个属性/值对由一个逗号和可选空格分隔。和
  • 每个属性值要么是正确引用的字符串,要么是单个“单词”。以及
  • 带引号的属性值字符串可能包含转义字符:(例如,
    v1=“这不是我的问题!”
    和/或
    v2=“这不是我的问题!”
    ),以及
  • 属性名称或不带引号的值“word”仅由alphanum和破折号组成(即
    [A-Za-z0-9_ \-]+
    )(请注意,原始问题没有明确定义此要求。)
  • 然后这个正则表达式(用C#)将正确地匹配
    [内容(a1=v1,a2=v2…)
    结构:

    Regex regexObj=新的Regex(
    @“#匹配[内容(a1=v1,a2=v2…)结构。
    \[内容\(\s*#开头分隔符
    #匹配所需的第一个属性/值对。
    [\w\-]+#第一个属性名(允许[A-Z-A-z0-9_-])。
    \s*=\s*#名称和值之间用=。
    (?:#组值规范备选方案。
    “[^”“\\]*(\\.[^”“\\]*)*”双引号字符串,
    |“[^'\]*(\\.[^'\]*)*”或单引号字符串,
    |[\w\-]+#或单个不带引号的“单词”。
    )#价值备选方案的终端组。
    #匹配可选的第二、第三…属性/值对。
    (?:#分组以允许可选对。
    \s*,\s*#所有以逗号分隔的对。
    [\w\-]+#属性名称。
    \s*=\s*#名称和值之间用=。
    (?:#组值规范备选方案。
    “[^”“\\]*(\\.[^”“\\]*)*”双引号字符串,
    |“[^'\]*(\\.[^'\]*)*”或单引号字符串,
    |[\w\-]+#或单个不带引号的“单词”。
    )#价值备选方案的终端组。
    )*#零对或更多可选A=V对。
    \s*\)\]\结束分隔符。“,
    RegexOptions.IgnoreCase | RegexOptions.ignorepattern空白);
    
    一旦您匹配并捕获了单个
    [CONTENT(…)]
    结构,您就可以使用另一个与每个atrib/值对匹配的正则表达式将其分离,一次一个


    看在上帝的份上,在编写像这样的非平凡正则表达式时,始终使用自由间距模式并添加注释和缩进!

    示例数据中的第一个attrib/value对读取:
    Name=“value,
    (该值缺少结束引号),最后一个属性/值对有一个正确引用的值,其中包括一个转义引号。第一个缺少右引号的属性/值对是一个输入错误吗?这是许多不必要的非捕获组。