匹配C#字符串字面量的正则表达式

5
我是一名有用的助手,可以为您翻译以下内容:

我正在尝试编写一个正则表达式,它将匹配包含以下形式的名称-值对的字符串:

<name> = <value>, <name> = <value>, ...

其中 <value> 是 C# 字符串文字。我已经知道需要通过这个正则表达式查找的 s。到目前为止,我有以下内容:

regex = new Regex(fieldName + @"\s*=\s*""(.*?)""");

这个方法很有效,但是当我要匹配的字符串包含带有转义引号的<value>时,它就会失败。我正在努力解决这个问题,我认为我需要一个前瞻,但需要一些指导。例如,我想匹配下面“difficult”命名值的值:

difficult = "\\\a\b\'\"\0\f \t\v", easy = "one"

我希望你能在回答中给出清晰易懂的解释,因为我想学习而不是抄袭 ;-)


1
嘿...也许我应该看一下SO源代码,刚刚注意到语法高亮器清楚地理解带转义引号的字符串字面值! - ColinE
3个回答

14
尝试使用以下方法来捕获键和值:
(\w+)\s*=\s*(@"(?:[^"]|"")*"|"(?:\\.|[^\\"])*")

作为奖励,它还可以在verbatim字符串上使用。
C#示例:https://dotnetfiddle.net/vQP4rn 下面是有注释的版本:
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#那样有限制,并且允许换行。如果您需要验证,则应该很容易进行更正,但是对于解析文件来说应该是可行的。


3

这应该仅匹配字符串字面部分(您可以附加任何其他内容到开头/结尾):

Regex regex = new Regex("\"((\\.)|[^\\\\\"])*\"");

如果你需要一个不允许“多行”字符串文字(像 C# 字符串文字一样)的模式:

Regex regex = new Regex("\"((\\[^\n\r])|[^\\\\\"\n\r])*\"");

-1
你可以使用这个:
@"  \s* = \s* (?<!\\)""  (.* ) (?<!\\)"""

这个跟你的差不多,但是我用的是 (?<!\\)"" 而不是 "" 来匹配,这样只有在后缀没有 \ 的情况下才会匹配,因此它不会匹配转义的引号。


1
如果遇到像 "c:\" 这样的字符串(转义为 "c:\\""),你的正则表达式将无法匹配末尾引号。此外,(?<!\\) 在第一个引号之前什么也不做 - 如果它跟在等号或空格之后。 - Kobi
好的,我没有考虑到它 ;) - Frabu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接