萝卜L

导航

条件正则过滤筛选 V1

迭代的新版见条件正则过滤筛选 V2


 

编辑(追加)条件正则(状态机?)

功能需求:

  • 字符串中无b,则追加bc;
  • 字符串中有bc则跳过;
  • 字符串中有b(无bc),则更改为bc,或移动追加为bc;
  • 保留其他部分。

示例:

  • 输入:
    • abcd
    • abd
    • ad
  • 输出:
    • abcd
    • adbc
    • adbc

实现:

Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript (regex101.com)

Regular expression:

^(?:(?!.*b)(?<pre1>.*)|(?<pre2>.*)(b(?!c))(?<post>.*))$

Substitution:

$<pre1>$<pre2>$<post>bc

对不支持命名捕捉组的,可使用捕捉索引:

Regular expression:

^(?:(?!.*b)(.*)|(.*)(:?b(?!c))(.*))$

Substitution:

$1$2$4bc

使用到功能:

  • 前向/后向断言(Positive/Negative Lookahead/Lookbehind);
  • 匿名组/命名组;

可使用功能:

  • 组索引复用编号(Duplicate subpattern group number),(?|..)
  • 复用组命名(Duplicate group names),标记(Flag/Modifiers)J

在线测试网站

Bulk Rename(BR)专项说明:

  • 正则是PRCE(PHP?)(而非ECMAScript(JavaScript) );
  • '命名捕捉组'的'名'中不可有数字;
  • 替换模式中需使用花括号{}(而非中括号<>);
  • 未捕获到时替换模式("$x")会返回空值null(而非空字符串);
  • 不支持(?|..)(PRCE支持);
  • 不完全支持'引用组'(查找模式中使用"\n");
  • 不支持预定义命名组((?(DEFINE)(..)..));
  • 最终使用
    ^((?:(?!b).)*)(?:b(?!c))?((?:(?!b).)*)$

     

posted on 2020-12-14 08:47  萝卜L  阅读(316)  评论(0编辑  收藏  举报