嗨我想要一个正则表达式模式来匹配一个非常具体的字符串语法。下面是我放在一起的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来说是不是太复杂了或者是什么(如果我对任何人都可以作为解决这样一个字符串的替代方案的任何建议持开放态度。)
感谢任何人提供的任何帮助。
克里斯
答案 0 :(得分:1)
...假设
v1="That's not \"MY\" problem!"
和/或v2='That\'s not "MY" problem!'
)。 AND [A-Za-z0-9_\-]+
)。 (请注意,原始问题并未明确定义此要求。)然后这个正则表达式(在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)