正则表达式捕获文本然后在捕获之前和之后添加另一个

时间:2017-07-06 12:01:39

标签: regex

输入字符串:

"test.com/dfafsf--fasfgf--fefegf-12345678+test (first text)"

我想应用正则表达式来检查输入字符串是否包含:12345678+test

如果找到则希望将其转换为:

sample.com/klklklklkl-klklkl-'CAPTURED12345678'+fefgreg-dgferg

我试过这个正则表达式:

\d+(?=+test)

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

您的模式是正确的。但是如果你的字符串是一个文件:
您可以一步使用 Perl 匹配替换

输入:

"test.com/dfafsf--fasfgf--fefegf-12345678+test (first text)"

你可以申请:

perl -lpe '/\d+(?=\+test)/g && ($m = $&) && s/^.+$/sample.com\/klklklklkl-klklkl-'CAPTURED'$m+fefgreg-dgferg/g' file
  1. 检查该行是否匹配:/\d+(?=\+test)/g
  2. 然后保存结果:($m = $&)
  3. 最后替换整行:s/^.+$/sample.com\/klklklklkl-klklkl-'CAPTURED'$m+fefgreg-dgferg/g
  4. 输出是:

    sample.com/klklklklkl-klklkl-CAPTURED12345678+fefgreg-dgferg
    

    正如您所看到的那样, CAPTURED12345678 周围没有单'引用,因为我使用[teg:bash]并且无法处理,因此您使用'"'"'CAPTURED$m'"'"'代替。

    但是如果你想:我的问题是,如何在捕获的数字之前和之后添加文字

    您需要知道您的模式存储在哪里,或者实际上哪个变量方法负责子匹配。例如,如果 Perl $&会处理它,我也会使用它。或者在 C ++ .str()

    match_results方法中

    因此,使用 Perl ,您可以使用s/^.+$/Before-Match $& After-Match/g并将其应用于文件:

    perl -lpe '/\d+(?=\+test)/g && ($m = $&) && s/^.+$/Before-Match=> $m <=After-Match/g' file
    

    输出将是:

    Before-Match=> 12345678 <=After-Match