我想知道是否有可能在正则表达式中替换它?
我们举一个简单的例子:
<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 | |
+-------------+-----------------------+--------------+ +----+-----+-----+
有谁知道实现目标的方法?
答案 0 :(得分:0)
您在大多数语言中可以做的是:
^(?:([^_]\S*)|_\S+)\.orig$
检查捕获组,如果它为空,请替换为default.dest
,否则替换为\1.dest
。检查捕获组部分是用语言进行的,但您可以看到类似的内容 here 。