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

How to select text between integers and unit names in Sublime Text 3 with regex?

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

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

正则表达式 #1 应该捕获整数,正则表达式 #3 应该捕获所需的单位名称,正则表达式 #2 只捕获这两组之间的所有名称。

这是我写的表达式:

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

#1 和#3 工作正常,#2 和#3 的组合也工作,但是#1 + #2 和#1 + #2 + #3 不工作,原因是错误 "Invalid lookbehind assertion encountered in regular expression".因此我认为错误在第一组:(?<=(1))。如果将我的#1 插入其中,整个表达式将如下所示:

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

这个表达式给我错误 "Invalid lookbehind assertion encountered in regular expression"。

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

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

我试图从 lookbehind 中删除元素,直到它开始工作,但它只有在只有一个元素时才有效:

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

即使在 \d 中添加量词也会出错。这不起作用:

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

如何在回顾中插入我的正则表达式#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))

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

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

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