我正在尝试将带引号的字符串与文字引号相匹配,例如:
"message\""
@"message"
使用
@(["'])[\S\s]*?\1|(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2
但
“邮件:\”“ +邮件+” \“
.NET中的内置正则表达式仅匹配"message: \"
,而不匹配"message: \""
,具体取决于在线匹配器,例如:
有人知道如何使其正常工作吗?
.NET代码:
string pattern = "([\"'])[\\S\\s]*?\\1|([\"'])(?:\\\\\\2|(?!\\\\\\2)(?!\\2).)*\\2";
string test = "\"message: \\\"\" + message + \"\\\".\n";
MatchCollection matches = Regex.Matches(test, pattern);
答案 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>";