RegEx:如何用$ n的字符串实例替换?

时间:2010-06-19 14:09:34

标签: regex

我正在尝试用00042098234替换4.2098234e-3格式的数字。我可以用以下方法捕获组件:

(-?)(\d+).(\d)+e-($d+)

但我不知道该怎么做是在$4次开始时重复零。

有什么想法吗?

提前致谢, 罗斯

理想情况下,我希望能够使用TextMate的查找/替换功能执行此操作,如果这有任何后果的话。我很欣赏这个问题有比RegEx更好的工具,但它仍然是一个有趣的问题(对我而言)。

2 个答案:

答案 0 :(得分:3)

你不能纯粹在正则表达式中这样做,因为替换字符串只是一个带反向引用的字符串 - 你不能在那里使用重复。

在大多数编程lnaguages中,你有正则表达式替换回调,这将能够做到这一点。但是,这不是文本编辑器可以做的事情(除非它有一些脚本支持)。

答案 1 :(得分:1)

这不是应该使用正则表达式完成的事情。也就是说,你可以做这样的事情,但这并不值得努力:正则表达式很复杂,而且功能有限。

以下是用多个零替换数字[0-9]的说明性示例。

    // generate the regex and the replacement strings
    String seq = "123456789";
    String regex = seq.replaceAll(".", "(?=[$0-9].*(0)\\$)?") + "\\d";
    String repl = seq.replaceAll(".", "\\$$0");

    // let's see what they look like!!!
    System.out.println(repl); // prints "$1$2$3$4$5$6$7$8$9"
    System.out.println(regex); // prints oh my god just look at the next section!

    // let's see if they work...
    String input = "3 2 0 4 x 11 9";
    System.out.println(
        (input + "0").replaceAll(regex, repl)
    ); // prints "000 00  0000 x 00 000000000"

    // it works!!!

正则表达式是(as seen on ideone.com)(为了便于阅读而略显格式化):

(?=[1-9].*(0)$)?
(?=[2-9].*(0)$)?
(?=[3-9].*(0)$)?
(?=[4-9].*(0)$)?
(?=[5-9].*(0)$)?
(?=[6-9].*(0)$)?
(?=[7-9].*(0)$)?
(?=[8-9].*(0)$)?
(?=[9-9].*(0)$)?
\d

但它是如何运作的?

正则表达式依赖于positive lookaheads。它匹配\d,但在此之前,它会尝试查看它是否为[1-9]。如果是这样,\1一直到输入的末尾,其中附加了0,以捕获0。然后第二个断言检查它是[2-9],如果是,\2一直到输入的末尾以抓取0,依此类推。

这项技术有效,但除了可爱的正则表达式练习之外,它可能没有实际可行性。

另请注意,11已替换为00。也就是说,每个1被替换为1。可能会将11识别为数字并将11个零代替,但它只会使正则表达式更复杂。