重复的正则表达式在范围内替换

时间:2013-08-25 22:03:54

标签: regex fsm pushdown-automaton

我有很多参考文献,我希望用文本中更下方的锚点替换。链接有一个非常规则的形式,所以它应该是非常可行的 - 至少使用脚本:

参考“[44]”应替换为以下html代码:[<a href="ref44">44</a>]

那个很容易。使用反向引用进行简单替换。但是有一个正则表达式(vim dialect,python,或者perl,如果必须的话。恐怖!)可以将以下内容转换为类似的链接:[44,45,77,91]? 也就是说,每个数字一个链接,其中链接组由一对方括号包围。

由于这涉及(理论上无界)内存,它不会用FSM映射1:1,因此应该由某种下推自动机处理,而不是正则表达式,但是一些方言更强大所以......

1 个答案:

答案 0 :(得分:1)

您可以重新运行此正则表达式替换,直到不再进行替换。

正则表达式:(\[(?:<a(?=\s|>)(?:[^>=|&)]|='(?:[^']|\\')*'|="(?:[^"]|\\")*"|=[^'"][^\s>]*)*>.*?<\/a>,)*)(\d+)([,\]])

替换为:$1<a href="ref$2">$2</a>$3

enter image description here

捕获组1的部分将匹配事件最复杂的复杂锚标记。

实施例

示例文字

[22][44,45,77,91]

替换后

第一次:

[<a href="ref22">22</a>][<a href="ref44">44</a>,45,77,91]

第二次:

[<a href="ref22">22</a>][<a href="ref44">44</a>,<a href="ref45">45</a>,77,91]

第三次:

[<a href="ref22">22</a>][<a href="ref44">44</a>,<a href="ref45">45</a>,<a href="ref77">77</a>,91]

第四次:

[<a href="ref22">22</a>][<a href="ref44">44</a>,<a href="ref45">45</a>,<a href="ref77">77</a>,<a href="ref91">91</a>]