我正在尝试用00042098234替换4.2098234e-3格式的数字。我可以用以下方法捕获组件:
(-?)(\d+).(\d)+e-($d+)
但我不知道该怎么做是在$4
次开始时重复零。
有什么想法吗?
提前致谢, 罗斯
理想情况下,我希望能够使用TextMate的查找/替换功能执行此操作,如果这有任何后果的话。我很欣赏这个问题有比RegEx更好的工具,但它仍然是一个有趣的问题(对我而言)。
答案 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个零代替,但它只会使正则表达式更复杂。