匹配可以以“或”与正则表达式一起开头的字符串的开头和结尾

时间:2012-09-16 10:23:25

标签: regex string pattern-matching

我有两个字符串

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

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

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

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

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

2 个答案:

答案 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中,任何事情都会发生。