我需要帮助设计Perl正则表达式以匹配单引号内的字符串,其中可能存在转义的单引号。
例如,输入文本:
'SELECT * FROM TABLE WHERE COLUMN = \'text\''
将匹配外部单引号内的所有内容,包括列文本周围的转义引号。即:
SELECT * FROM TABLE WHERE COLUMN = \'text\'
我试过了:
/\s*'([^'|[^\\']]*)'\s*/
但是这个匹配组根本没有匹配任何东西。任何帮助将不胜感激。
答案 0 :(得分: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;