TextMate:正则表达式用0替换$ 1

时间:2010-06-21 11:35:43

标签: regex textmate

我正在尝试修复一个包含1位和2位数字的文件,使它们全长2位数。

该文件的格式为:

10,5,2
2,4,5
7,7,12
...

我设法将问题编号与:

匹配
(^|,)(\d)(,|$)

我现在要做的就是用以下内容替换有问题的字符串:

${1}0$2$3

但是TextMate给了我:

10${1}05,2

有什么想法吗?

提前致谢, 罗斯

5 个答案:

答案 0 :(得分:7)

根据this,TextMate支持单词边界锚点,因此您还可以搜索\b\d\b并将所有内容替换为0$0。 (感谢Peter Boughton提出的建议!)

这样做的好处是可以一次性捕获所有数字 - 您的解决方案必须至少应用两次,因为正则表达式引擎已经在成功替换后的下一个数字之前使用了逗号。

答案 1 :(得分:2)

注意: Tim的解决方案更简单并且解决了这个问题,但是我会留在这里作为参考,以防有人有类似但更复杂的问题,使用lookarounds可以支持。


比表达式更简单的方法是替换:

(?<!\d)\d(?!\d)

使用:

0$0

这是“将所有单个数字替换为0然后自己”。

正则表达式是:
负面看后面找不到数字(?<!\d)
单个数字:\d
否定前瞻,找不到数字(?!\d)

单一这是位置匹配(不是字符匹配),它适用于逗号和开始/结束位置。

$0部分表示“完全匹配” - 由于后方/前方匹配位置,这将包含匹配的单个数字。

答案 2 :(得分:2)

对于任何来到这里的人,如@Amarghosh suggested,这是一个错误,或故意行为导致问题,如果没有别的。

我刚遇到此问题并且必须使用以下解决方法:如果您设置另一个捕获组,然后使用条件插入,它将起作用。例如,我有一个像<WebObject name=Frage01这样的字符串,想要用01替换02,所以我捕获了$1中的主字符串和{{1}中的结束号这给了我一个看起来像$2的正则表达式。

然后替换为(<WebObject name=(Frage|Antwort))(01)

$1(?2:02)是条件插入,在这种情况下总会找到一些东西,但为了解决在(?2:02)末尾附加数字的奇怪难题,这是必要的。希望能帮助别人。有关条件插入here

的文档

答案 3 :(得分:1)

在TextMate 1.5.11(1635)${1}不起作用(如所描述的OP)。

我很欣赏重新改变查询字符串的许多建议,但是如果你想在捕获组和数字之间中断,有一个更简单的解决方案:\u

它是TextMate特定的替换语法,可将以下字符转换为大写。由于数字没有大写,它什么也没做,继续前进。它在the link from Tim Pietzcker's answer中描述。


在我的情况下,我不得不清理一个csv文件,其中盒子测量单位为cm x cm x mm。因此,我必须在前两个数字中添加零。

Text: "80 x 40 x 5 mm"
Desired text: "800 x 400 x 5 mm"

Find: (\d+) x (\d+) x (\d+)
Replace: $1\u0 x $2\u0 x $3 mm

关于10个以上捕获组的支持,我不知道这是不是一个bug。但是正如OP和@rossmcf所写,$10被替换为null

答案 4 :(得分:0)

您无需${1} - 替换字符串最多只支持九个组 - 因此不会将其误认为$10

替换为$10$2$3