我正在尝试编写一个regular expression,它将匹配包含以下形式的名称 - 值对的字符串:
<name> = <value>, <name> = <value>, ...
其中&lt; value&gt;是一个C#字符串文字。我已经知道我需要通过这个正则表达式找到的s。到目前为止,我有以下内容:
regex = new Regex(fieldName + @"\s*=\s*""(.*?)""");
这很好用,但是当我想要匹配的字符串的情况下,它当然无法匹配&lt; value&gt;带有逃脱的报价。我正在努力解决如何解决这个问题,我认为我需要一个前瞻,但需要一些指示。举个例子,我希望能够匹配下面“困难”命名值的值:
difficult = "\\\a\b\'\"\0\f \t\v", easy = "one"
我很感激您对答案的理解,我想学习,而不是复制; - )
答案 0 :(得分:10)
尝试此操作以捕获键和值:
(\w+)\s*=\s*(@"(?:[^"]|"")*"|"(?:\\.|[^\\"])*")
作为奖励,它也适用于逐字字符串
示例:http://regexhero.net/tester/?id=9f38ec0d-8f53-4e03-aa58-520fcf4c0f98
C#示例:http://ideone.com/b7YWn,http://ideone.com/Ykbci
这是一个带注释的版本:
string pattern = @"
(\w+)\s*=\s* # key =
( # Capturing group for the string
@"" # verbatim string - match literal at-sign and a quote
(?:
[^""]|"""" # match a non-quote character, or two quotes
)* # zero times or more
"" #literal quote
| #OR - regular string
"" # string literal - opening quote
(?:
\\. # match an escaped character,
|[^\\""] # or a character that isn't a quote or a backslash
)* # a few times
"" # string literal - closing quote
)";
MatchCollection matches = Regex.Matches(s, pattern,
RegexOptions.IgnorePatternWhitespace);
请注意,常规字符串允许转义所有字符,与C#不同,并允许换行符。如果需要验证,应该很容易纠正,但它应该是用于解析的文件。
答案 1 :(得分:3)
这应该只匹配字符串文字部分(你可以在你想要的任何其他开头/结尾处添加):
Regex regex = new Regex("\"((\\.)|[^\\\\\"])*\"");
如果你想要一个不允许“多行”字符串文字的模式(就像C#字符串文字一样):
Regex regex = new Regex("\"((\\[^\n\r])|[^\\\\\"\n\r])*\"");
答案 2 :(得分:0)
您可以使用:
@" \s* = \s* (?<!\\)"" (.* ) (?<!\\)"""
它几乎与您的相似,但我没有使用""
,而是使用(?<!\\)""
来匹配后缀\不存在,因此它不会与转义引号匹配。