条件正则过滤筛选 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).)*)$