Perl正则表达式匹配引号中的字符串,同时忽略转义的引号

时间:2015-06-04 20:52:00

标签: regex perl

我需要帮助设计Perl正则表达式以匹配单引号内的字符串,其中可能存在转义的单引号。

例如,输入文本:

'SELECT * FROM TABLE WHERE COLUMN = \'text\''

将匹配外部单引号内的所有内容,包括列文本周围的转义引号。即:

SELECT * FROM TABLE WHERE COLUMN = \'text\'

我试过了:

/\s*'([^'|[^\\']]*)'\s*/

但是这个匹配组根本没有匹配任何东西。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

/'((?:\\.|[^'\\])*)'/

或者可以提供更好性能的展开版本:

/'([^'\\]*(?:\\.[^'\\]*)*)'/

请参阅Demo 1Demo 2

REGEX说明:

  • ' - 初始单引号
  • ((?:\\.|[^'\\])*) - 捕获由...组成的小组
    • (?:\\.|[^'\\])* - 除'\或转义实体以外的0个或多个字符
  • ' - 最终单引号

演示:

my $str = "'SELECT * FROM TABLE WHERE COLUMN = \\'text\\'' "; 
 print "$str\n";
if ( $str =~ /'([^'\\]*(?:\\.[^'\\]*)*)'/ ) {
    print "$1\n";
}

输出demo program

SELECT * FROM TABLE WHERE COLUMN = \'text\'

答案 1 :(得分:0)

我认为你正在寻找的正则表达式是这样的:

/\s*'(([^']|[\\'])*)'\s*/

答案 2 :(得分:0)

如果这只是针对已知来源的转储数据,您可以对其进行评估。

my $str =q{ 'SELECT * FROM TABLE WHERE COLUMN = \'text\'' };
my $out = eval $str;
say $out;