目的是在使用regex的Sublime Text 3中在整数和单位名称之间选择文本。我这样想:首先选择整数和单位名称,然后选择它们之间的所有内容:
(?<=(1))(2)(?=(3))
正则表达式1应该捕获整数,正则表达式3应该捕获所需的单元名,正则表达式2仅捕获这两个组之间的所有整数。
这是我写的表达式:
(((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+
(.{1,10}?)
((?<=\d)|(?<=\b))(моль|мкм|мф|нм|лм|кг|кд|Гц|Кл|К|Дж|Вт|м|с|ф|А)(?=\b)
#1和#3可以正常工作,#2和#3的组合也可以,但是#1 +#2和#1 +#2 +#3不起作用,原因是错误“在正则表达式中遇到无效的后置断言” 。因此,我认为错误在于第一组:(?<=(1))
。如果将我的#1插入其中,则整个表达式将如下所示:
(?<=((((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+))
此表达式给我错误“在正则表达式中遇到无效的向后声明”。
表达式有什么问题?它应该与精确的捕获表达式结合使用,因此为了测试它,我使用了此表达式(#1 +#2):
(?<=((((?<=\d)([-−,*\s]|(X·))(?=\d))|(\d))+))(.*+)
我尝试从后面的元素中删除元素,直到它开始工作为止,并且仅在只有一个元素时才起作用:
(?<=(\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 мкм
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))
关键是Sublime Text regex由Boost regex库提供支持,该库不支持无限宽的后向查找。
为了缓解这种情况,Boost支持\K
像正向后方那样工作的运算符。一旦\K
匹配了左侧的模式,\K
就将其丢弃,开始将新匹配的文本写入一个清晰的缓冲区。
使用该PATTERN_1\KPATTERN_2(?=PATTERN_3)
方案替换为空字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句