【问题标题】:.NET Regex not matching properly.NET 正则表达式不正确匹配
【发布时间】:2018-10-15 14:14:37
【问题描述】:

我正在尝试将带引号的字符串与被接受的文字引号相匹配,例如:

"message\""

@"message"

@(["'])[\S\s]*?\1|(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2

但对于

"消息:\"" + 消息 + "\"

.NET 中的内置正则表达式仅匹配 "message: \" 而不是 "message: \"",就像它应该根据在线匹配器一样:

https://regexr.com/4173n

有人知道如何让它正常工作吗?

.NET 代码:

string pattern = "([\"'])[\\S\\s]*?\\1|([\"'])(?:\\\\\\2|(?!\\\\\\2)(?!\\2).)*\\2";
string test = "\"message: \\\"\" + message + \"\\\".\n";
MatchCollection matches = Regex.Matches(test, pattern);

【问题讨论】:

  • 对我来说,这看起来像XY Problem。您是否尝试使用正则表达式解析 JSON?
  • 不,它是一个巨大项目的翻译。 X 问题是:如何用 .NET Regex 匹配字符串?
  • 显示重现问题的代码。您是否使用逐字字符串文字?
  • @WiktorStribiżew 我编辑显示代码。
  • 您没有转义反斜杠模式。

标签: .net regex string


【解决方案1】:

您在模式中遗漏了 @ 并忘记转义文字反斜杠模式,该模式必须在常规字符串文字中包含 4 个反斜杠。

文字字符串正则表达式看起来像

@(["'])[\S\s]*?\1|(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2

如果您想使用常规字符串文字

string pattern = "@([\"'])[\\S\\s]*?\\1|([\"'])(?:\\\\\\2|(?!\\\\\\2)(?!\\2).)*\\2";

或逐字字符串文字,您只需将" 与另一个" 一起转义:

string pattern = @"@([""'])[\S\s]*?\1|([""'])(?:\\\2|(?!\\\2)(?!\2).)*\2";

【讨论】:

    【解决方案2】:

    你需要这个正则表达式:

    @"^(?<quote>(?<![\\])['""])((.(?!(?<![\\])\k<quote>))*.?)\k<quote>"
    

    它确实,你想要什么。匹配 qoutes 和介于两者之间的所有内容。

    这实际上不是我的正则表达式,但它适用于你的情况。

    它的工作原理是将引号字符(单引号或双引号)存储在捕获组中,然后查找此字符,忽略任何转义的引号。

    编辑: 如果你不喜欢 @-quoted 字符串,这里是普通字符串(转义):

    string pattern = "^(?<quote>(?<![\\])['\"])((.(?!(?<![\\])\k<quote>))*.?)\k<quote>";
    

    【讨论】:

    • 无法使用,你能在在线匹配器中告诉我吗?
    • 注意双引号,它们只在代码中需要,在线解析器中不需要(因为它们在@-Quoted字符串中使用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多