2010-06-21 82 views
0

我试图修复一个文件全1位和2位数字,使他们所有2位数字长。

文件的格式为:

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

我已经成功地与匹配的问题数:

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

所有我想现在要做的就是用替换字符串违规:

${1}0$2$3 

但TextMate给我:

10${1}05,2 

任何想法?

由于提前, 罗斯

回答

6

根据this,TextMate支持字边界定位符,因此您还可以搜索\b\d\b并全部替换为0$0。 (感谢Peter Boughton的建议!)

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

+0

+1为增值回答! – Amarghosh 2010-06-21 11:44:33

+0

根据该链接,支持$ 0,因此您可以将正则表达式简化为'\ b \ d \ b',并在结果中使用0 $ 0。 – 2010-06-21 11:52:01

+0

更好:)让我更正确地阅读它更彻底。编辑我的答案。 – 2010-06-21 12:06:48

0

你不必${1} - 替换字符串支持最高仅达9组 - 这样就不会误认为是$10

替换$10$2$3

+0

+1,同样:) – 2010-06-21 11:45:46

+0

当我尝试这一点,我发现,$ 10,替换为空,所以: 25,9, 变为: 259, – 2010-06-21 13:40:59

+0

@rossmcf这是更换的正常行为与正则表达式。我没有文本,但如果你是对的,那可能是一个错误。 – Amarghosh 2010-06-21 13:57:26

2

注: Tim的解决方案更简单,解决了这个问题,但我会在这里把这个留给参考,如果有人有类似但更复杂的问题,它使用lookarounds支持。


比你的表达更简单的办法是更换:

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

有了:

0$0 

这就是 “全部替换单位数字0,那么本身”。

的正则表达式是:
负回顾后不找一个数字(?<!\d)
单个位数:\d
负向前查找到找不到一个数字(?!\d)

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

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

+0

谢谢。必须玩后视/前进。我是一个正则表达式n00b。 – 2010-06-21 13:49:13

2

要有人来这里,因为@Amarghosh suggested,这是一个错误,或者故意行为导致的问题,如果没有别的。

我刚刚遇到了这个问题,不得不使用下面的解决方法:如果设置了另一个捕获组,然后使用条件插入,它将起作用。例如,我有一个像<WebObject name=Frage01这样的字符串,并且想用02替换01,所以我捕获了主要字符串$1$2中的最后一个数字,这给了我一个看起来像(<WebObject name=(Frage|Antwort))(01)的正则表达式。

然后替换为$1(?2:02)

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

+0

现在*有*一个不错的功能! – 2013-06-11 12:53:43

+0

我能够使用您的解决方法在替换后放置一个数字。在我的情况下,我没有任何东西需要捕获才能用于条件插入,所以我只是在我知道不匹配任何字符的情况下做了一个捕获组,并且有条件地插入了任何内容:'^(。*)( π?)$'替换为$ 1(?2:)0' – 2015-09-25 17:16:45

1

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

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

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


在我的情况下,我不得不清理一个csv文件,其中箱的尺寸以厘米x厘米x毫米给出。因此,我不得不为前两个数字加零。

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个捕获团体的支持,我不知道这是否是一个错误。但正如OP和@rossmcf所写,$10被替换为null