如何在Sublime Text 3中用正则表达式选择整数和单位名称之间的文本?

时间:2016-08-17 10:24:42

标签: regex sublimetext3 sublimetext regex-lookarounds

目标是在Sublime Text 3中使用正则表达式在整数和单位名称之间选择文本。我这样想:首先选择整数和单位名称,然后选择它们之间的所有内容:

(?<=(1))(2)(?=(3))

Regexp#1应该捕获整数,regexp#3应该捕获所需的单元名称,regexp#2只捕获这两个组之间的所有内容。

以下是我写的表达式:

  1. (((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+
  2. (.{1,10}?)
  3. ((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b)
  4. <#>#1和#3工作正常,#2和#3的组合也可以,但#1 +#2和#1 +#2 +#3不起作用,原因是错误“无效的lookbehind断言遇到了正则表达式”。因此,我认为错误发生在第一组:(?<=(1))。如果你在其中插入#1,整个表达式将如下所示:

    (?<=((((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+))
    

    这个表达式给出了错误“正则表达式中遇到无效的lookbehind断言”。

    这个表达有什么问题?它应该与精确捕获表达式结合使用,所以为了测试它,我使用了这个表达式(#1 +#2):

    (?<=((((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+))(.*+)
    

    我尝试从lookbehind中移除元素直到它开始工作,并且只有当它只有一个元素时它才有效:

    (?<=(\d))(.*+)
    

    即使将量词添加到\d,也会出错。这不起作用:

    (?<=(\d+))(.*+)
    

    如何在lookbehind中插入我的正则表达式#1?我不知道为什么它不起作用。

    提前致谢!

    PS:单位是俄语,所以这是我用来测试正则表达式的文本:

    9 192 631 770 Гц[15];
    299 792 458 м/с[15];
    6,022 14X·1023 моль−1;
    540·1012 Гц
    1 мкм-
    1 мкм
    1мкм
    1&#160;мкм
    12 мкм
    12мкм
    12&#160;мкм
    500 647 м
    500 647м
    12 нм
    12нм
    12&#160;нм
    12 сс
    

    更新:正则表达式的最终版和工作版:

    ((((?<=\d)([-−,*·\s]|(X·))(?=\d))|(\d))+)\K(.{0,10}?)(?=(((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b)))
    

    所做的所有更改都是我改变了表达式的结构:

    (?<=(1))(2)(?=(3))
    

    对此:

    (1)\K(2)(?=(3))
    

1 个答案:

答案 0 :(得分:1)

重点是Sublime Text正则表达式由Boost正则表达式库提供支持,该库不支持无限宽度的后视。

为了缓解这种情况,Boost支持\K运算符,其运算方式类似于正向后视。一旦\K左侧的模式匹配,\K就会丢弃它,开始将新匹配的文本写入清除缓冲区。

使用PATTERN_1\KPATTERN_2(?=PATTERN_3)方案替换为空字符串。