求可识别未被单引号包裹的|的Perl正则表达式
Perl正则匹配未被单引号包裹的|符号
核心解决方案
使用Perl的回溯控制动词(*SKIP)(*FAIL)可以简洁实现需求,正则表达式如下:
/'[^']*'(*SKIP)(*FAIL)|\|/
正则逻辑说明
'[^']*'(*SKIP)(*FAIL):匹配所有单引号包裹的字符串(假设单引号无转义),(*SKIP)标记跳过该匹配区域,(*FAIL)让这部分匹配失效,正则会直接忽略单引号内的内容。\|:匹配所有未被单引号包裹的|符号,只有这部分匹配成功时,整个正则才会返回true。
测试示例代码
my @test_cases = ( 'abc|def', # 匹配:|未被单引号包裹 '\'abc\'|def', # 匹配:|在单引号外 'abc|\'def\'', # 匹配:|在单引号外 '\'abc|def\'', # 不匹配:|在单引号内 'abc\'|\'def', # 匹配:|不在完整的单引号包裹字符串中 '|', # 匹配:无单引号的| '\'|\'', # 不匹配:|被单引号包裹 ); foreach my $case (@test_cases) { if ($case =~ /'[^']*'(*SKIP)(*FAIL)|\|/) { print "匹配: $case\n"; } else { print "不匹配: $case\n"; } }
处理转义单引号的场景
如果你的文本中存在转义单引号(比如'it\'s a | test'),需要调整正则以识别转义的单引号,避免误判单引号的结束位置:
/'[^'\\]*(?:\\.[^'\\]*)*'(*SKIP)(*FAIL)|\|/
兼容旧版本Perl的实现
如果你需要兼容不支持(*SKIP)(*FAIL)的Perl版本,可以使用以下正则:
/^(?:[^'|]+|'[^']*')*\|/
该正则从字符串开头开始,先跳过所有非单引号、非|的字符,以及所有单引号包裹的内容,直到找到一个未被单引号包裹的|,以此判断是否匹配。
内容的提问来源于stack exchange,提问作者quentinnuk
相关产品推荐
相关产品推荐

