.NET正则表达式不正确匹配

时间:2018-10-15 14:14:38

标签: .net regex string

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

"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);

2 个答案:

答案 0 :(得分:1)

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

文字字符串regex看起来像

@(["'])[\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";

答案 1 :(得分:0)

您需要此正则表达式:

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

可以,您想要的。匹配qoutes及其之间的所有内容。

它实际上不是我的正则表达式,但在您的情况下有效。

通过将引号字符(单引号或双引号)存储在捕获组中来工作,然后查找它,而忽略所有转义的引号。

修改: 如果您不喜欢用@引号引起来的字符串,请使用正常的字符串(转义):

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