You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求可识别未被单引号包裹的|的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:25:19