我有两个字符串
string a = "text 'text'"
string b = 'text "text"'
在这种语言中,"
and'
都可以用来开始和结束字符串文字,并且它们可以在其中包含其他符号(引号在撇号内有效,反之亦然)
我需要一个可以同时处理两者的正则表达式,目前我有:
(?:\"|')(?<content>[^\"']*)(?:\"|')
但用于string a
,这只会给我"text '
而不是完整的字符串。
我有两个字符串
string a = "text 'text'"
string b = 'text "text"'
在这种语言中,"
and'
都可以用来开始和结束字符串文字,并且它们可以在其中包含其他符号(引号在撇号内有效,反之亦然)
我需要一个可以同时处理两者的正则表达式,目前我有:
(?:\"|')(?<content>[^\"']*)(?:\"|')
但用于string a
,这只会给我"text '
而不是完整的字符串。
怎么样:
('|")(?<content>[^\1]*)\1
基本技术是:
(["'])((?:(?!\1).)*)\1
开头的引号在组 #1 中被捕获,并且(?:(?!\1).)*
匹配零个或多个除被捕获的字符之外的任何字符。这包含在另一组捕获括号中,因此内容被捕获在组 #2 中。然后最终\1
匹配结束报价。
但是您正在使用命名组来捕获内容,因此最好在整个过程中使用命名组(特别是因为您没有说明您使用的是哪种风格,并且命名组和编号组之间的交互从一种口味到另一种口味)。这应该适用于 .NET 或 PHP:
(?<quote>["'])(?<content>(?:(?!\k<quote>).)*)\k<quote>
但是,如果您使用的是 .NET,我建议您改用它:
(?:"(?<content>[^"]*)"|'(?<content>[^']*)')
大多数风格使得在同一个正则表达式中重用组名变得困难或不可能,但在 .NET 中一切正常。