我正在尝试编写一个正则表达式,它将匹配除尚未转义的撇号之外的所有内容。考虑以下:
<?php $s = 'Hi everyone, we\'re ready now.'; ?>
我的目标是编写一个基本上匹配其字符串部分的正则表达式。我正在考虑诸如此类的事情
/.*'([^']).*/
为了匹配一个简单的字符串,但我一直在试图弄清楚如何在该撇号上进行负向后查找,以确保它前面没有反斜杠......
有任何想法吗?
- JMT
这是我的测试用例解决方案:
/.*?'((?:\\\\|\\'|[^'])*+)'/
我的(Perl,但我不使用任何我认为不特定的 Perl 功能)证明:
use strict;
use warnings;
my %tests = ();
$tests{'Case 1'} = <<'EOF';
$var = 'My string';
EOF
$tests{'Case 2'} = <<'EOF';
$var = 'My string has it\'s challenges';
EOF
$tests{'Case 3'} = <<'EOF';
$var = 'My string ends with a backslash\\';
EOF
foreach my $key (sort (keys %tests)) {
print "$key...\n";
if ($tests{$key} =~ m/.*?'((?:\\\\|\\'|[^'])*+)'/) {
print " ... '$1'\n";
} else {
print " ... NO MATCH\n";
}
}
运行此显示:
$ perl a.pl
Case 1...
... 'My string'
Case 2...
... 'My string has it\'s challenges'
Case 3...
... 'My string ends with a backslash\\'
请注意,开始时的初始通配符需要是非贪婪的。然后我使用非回溯匹配来吞噬 \\ 和 \' 以及其他任何不是独立引号字符的内容。
我认为这可能模仿编译器的内置方法,这应该使它非常防弹。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)