正则表达式有条件替换

时间:2014-10-20 15:14:33

标签: regex if-statement

我想知道是否有可能在正则表达式中替换它?

我们举一个简单的例子:

  • <filename>.orig
  • 应更改每个<filename>.dest
  • _<filename>.orig
  • 应更改每个default.dest

使用此正则表达式,如果它以下划线作为前缀,则在第2组中捕获<filename>,否则在第3组中捕获:

/^(_)?((?(1)[a-z-]+|))((?(1)|[a-z-]+))?\.orig$/i

现在,我想在替换中使用条件语句(/(?(if)then|else)/),如下所示:

/^(_)?((?(1)[a-z-]+|))((?(1)|[a-z-]+))?\.orig$/(?($2)default|$3)\.dest/i

显然,不幸的是,它不起作用:

+-------------+-----------------------+--------------+    +----+-----+-----+
| Input       | Output                | Expected     |    | $1 | $2  | $3  |
+-------------+-----------------------+--------------+    +----+-----+-----+
| foo.origin  | (?()default|foo).dest | foo.dest     |    |    |     | foo |
| bar.origin  | (?()default|bar).dest | bar.dest     |    |    |     | bar |
| _baz.origin | (?(baz)default|).dest | default.dest |    | _  | baz |     |
+-------------+-----------------------+--------------+    +----+-----+-----+

有谁知道实现目标的方法?

1 个答案:

答案 0 :(得分:0)

您在大多数语言中可以做的是:

^(?:([^_]\S*)|_\S+)\.orig$

检查捕获组,如果它为空,请替换为default.dest,否则替换为\1.dest。检查捕获组部分是用语言进行的,但您可以看到类似的内容 here