2

我有两个字符串

string a = "text 'text'"
string b = 'text "text"'

在这种语言中,"and'都可以用来开始和结束字符串文字,并且它们可以在其中包含其他符号(引号在撇号内有效,反之亦然)

我需要一个可以同时处理两者的正则表达式,目前我有:

(?:\"|')(?<content>[^\"']*)(?:\"|')

但用于string a,这只会给我"text '而不是完整的字符串。

4

2 回答 2

1

怎么样:

('|")(?<content>[^\1]*)\1
于 2012-09-16T10:40:46.033 回答
0

基本技术是:

(["'])((?:(?!\1).)*)\1

开头的引号在组 #1 中被捕获,并且(?:(?!\1).)*匹配零个或多个除被捕获的字符之外的任何字符。这包含在另一组捕获括号中,因此内容被捕获在组 #2 中。然后最终\1匹配结束报价。

但是您正在使用命名组来捕获内容,因此最好在整个过程中使用命名组(特别是因为您没有说明您使用的是哪种风格,并且命名组和编号组之间的交互从一种口味到另一种口味)。这应该适用于 .NET 或 PHP:

(?<quote>["'])(?<content>(?:(?!\k<quote>).)*)\k<quote>

但是,如果您使用的是 .NET,我建议您改用它:

(?:"(?<content>[^"]*)"|'(?<content>[^']*)')

大多数风格使得在同一个正则表达式中重用组名变得困难或不可能,但在 .NET 中一切正常。

于 2012-09-16T21:00:53.247 回答