代码之家  ›  专栏  ›  技术社区  ›  Ross McFarlane

textmate:regex用以下0替换$1

  •  0
  • Ross McFarlane  · 技术社区  · 14 年前

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

    文件的格式为:

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

    我已经设法将问题编号与以下内容匹配:

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

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

    ${1}0$2$3
    

    但textmate给了我:

    10${1}05,2
    

    有什么想法吗?

    事先谢谢, 罗斯

    5 回复  |  直到 11 年前
        1
  •  7
  •   Tim Pietzcker    14 年前

    根据 this ,textmate支持单词边界锚,因此您也可以搜索 \b\d\b 全部替换为 0$0 . (感谢彼得·布格顿的建议!)

    这有一个优势,即一次就可以捕获所有的数字-您的解决方案必须至少应用两次,因为regex引擎已经在成功替换后的下一个数字之前消耗了逗号。

        2
  •  2
  •   Peter Boughton    14 年前

    注: Tim的解决方案更简单,也解决了这个问题,但我将把它留在这里作为参考,以防有人遇到类似但更复杂的问题,使用lookuands可以支持。


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

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

    用:

    0$0
    

    它是“用0替换所有的单个数字,然后是它本身”。

    正则表达式为:
    反向查找找不到数字 (?<!\d)
    一位数: \d
    负向前看找不到数字 (?!\d)

    这是一个位置匹配(不是字符匹配),它同时满足逗号和开始/结束位置。

    这个 $0 部分显示“整个匹配”-由于查找/前进匹配位置,这将包含匹配的单个数字。

        3
  •  2
  •   Community Neeleshkumar S    7 年前

    任何来到这里的人,如@amarghosh suggested ,这是一个bug,或者故意的行为,如果没有其他的话,会导致问题。

    我刚刚遇到了这个问题,必须使用以下解决方法:如果您设置了另一个捕获组,然后使用条件插入,它将工作。例如,我有一个字符串 <WebObject name=Frage01 并想取代 01 具有 02 ,所以我捕获了主字符串 $1 结束数字在 $2 给了我一个雷吉士 (<WebObject name=(Frage|Antwort))(01) .

    然后替换的是 $1(?2:02) .

    这个 (?2:02) 是条件插入,在这种情况下总是会找到一些东西,但为了解决在 $n . 希望能帮助别人。有关于条件插入的文档 here

        4
  •  1
  •   Rasmus    11 年前

    在textmate 1.5.11(1635)中 ${1} 不工作(如所述操作)。

    我很欣赏修改查询字符串的许多建议,但是如果您想在捕获组和数字之间进行分隔,有一个更简单的解决方案: \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 .

        5
  •  0
  •   Amarghosh    14 年前

    你不需要 ${1} -替换字符串最多只支持9个组-因此不会出错 $10 .

    替换为 $10$2$3