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