用于匹配C#字符串文字的正则表达式

时间:2011-02-10 05:34:30

标签: c# regex

我正在尝试编写一个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"

我很感激您对答案的理解,我想学习,而不是复制; - )

3 个答案:

答案 0 :(得分:10)

尝试此操作以捕获键和值:

(\w+)\s*=\s*(@"(?:[^"]|"")*"|"(?:\\.|[^\\"])*")

作为奖励,它也适用于逐字字符串 示例:http://regexhero.net/tester/?id=9f38ec0d-8f53-4e03-aa58-520fcf4c0f98
C#示例:http://ideone.com/b7YWnhttp://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* (?<!\\)""  (.* ) (?<!\\)"""

它几乎与您的相似,但我没有使用"",而是使用(?<!\\)""来匹配后缀\不存在,因此它不会与转义引号匹配。