【问题标题】:Regex for matching C# string literals用于匹配 C# 字符串文字的正则表达式
【发布时间】:2011-06-24 15:14:27
【问题描述】:

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

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

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

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

这很好用,但是在我尝试匹配的字符串包含带有转义引号的 的情况下,它当然无法匹配。我正在努力解决如何解决这个问题,我认为我需要向前看,但需要一些指示。例如,我希望能够匹配以下“困难”命名值的值:

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

我希望你的答案能给出一个体面的解释,我想学习,而不是复制;-)

【问题讨论】:

  • 嘿......也许我应该看看SO源代码,只是注意到语法荧光笔清楚地理解了带有转义引号的字符串文字!

标签: c# regex


【解决方案1】:

这应该只匹配字符串文字部分(你可以在开头/结尾添加任何你想要的东西):

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

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

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

【讨论】:

    【解决方案2】:

    试试这个来捕获键和值:

    (\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 以获得完整的解决方案,以及指向非常有用的测试站点的链接。虽然我确实要求解释,但这个神秘的正则表达式对我来说有点难以破解!
    • @Colin - 我希望这会更好。
    • 谢谢,你是明星。正则表达式显然非常强大,如果它不是那么该死的神秘,那将是一个很棒的工具!
    【解决方案3】:

    你可以用这个:

    @"  \s* = \s* (?<!\\)""  (.* ) (?<!\\)"""
    

    它几乎和你的一样,但是我没有使用"",而是使用(?&lt;!\\)"" 来匹配不存在后缀 \ 的情况,因此它不会匹配转义的引号。

    【讨论】:

    • "c:\" 这样的字符串怎么样?(转义为"c:\\") - 您的正则表达式与结尾引号不匹配。此外,(?&lt;!\\) 在第一个引号之前什么也不做 - 如果后面是等号或空格。
    • 对,我没想到 ;)
    猜你喜欢
    • 1970-01-01
    • 2017-06-14
    • 2011-12-21
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多