目标是在Sublime Text 3中使用正则表达式在整数和单位名称之间选择文本。我这样想:首先选择整数和单位名称,然后选择它们之间的所有内容:
(?<=(1))(2)(?=(3))
Regexp#1应该捕获整数,regexp#3应该捕获所需的单元名称,regexp#2只捕获这两个组之间的所有内容。
以下是我写的表达式:
(((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+
(.{1,10}?)
((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b)
(?<=(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 мкм
12 мкм
12мкм
12 мкм
500 647 м
500 647м
12 нм
12нм
12 нм
12 сс
更新:正则表达式的最终版和工作版:
((((?<=\d)([-−,*·\s]|(X·))(?=\d))|(\d))+)\K(.{0,10}?)(?=(((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b)))
所做的所有更改都是我改变了表达式的结构:
(?<=(1))(2)(?=(3))
对此:
(1)\K(2)(?=(3))
答案 0 :(得分:1)
重点是Sublime Text正则表达式由Boost正则表达式库提供支持,该库不支持无限宽度的后视。
为了缓解这种情况,Boost支持\K
运算符,其运算方式类似于正向后视。一旦\K
左侧的模式匹配,\K
就会丢弃它,开始将新匹配的文本写入清除缓冲区。
使用PATTERN_1\KPATTERN_2(?=PATTERN_3)
方案替换为空字符串。