正则表达式在$符号之间查找文本块

时间:2018-08-29 21:45:45

标签: regex regex-lookarounds regex-group

我正在尝试提取美元价值之间的文本块。例如下面的文本:

$12.33  
1  
0000  
0000  
Some Text 1 line1  
Some Text 1 line2  
$0.00  
123A  
some Text 2  
$12.34  
000  
some text 3  
$90.33

我希望我的正则表达式可以让我获得3块。

block1 应该具有:

1  
0000  
0000  
Some Text1  
some Text1  

block2 应该具有:

123A  
Some Text 2  

block3 应该具有

000  
Some Text 3  

下面是我写的正则表达式:

(\$[0-9]{1,3}\.[0-9]{1,2})(?<Text>.*?)(\$[0-9]{1,3}\.[0-9]{1,2})

regex返回第1块和第3块。我又如何获得第2块?

是否也可以立即获得文本块?

2 个答案:

答案 0 :(得分:3)

一个想法,如果其他行在行首不包含$,则仅提取数字行之后的部分。它不检查匹配项是否在两个$位数字行之间。

/^\$\d{1,3}\.\d{1,2}\h*\R\K(?:^[^$].+\R)+/m

See demo at regex101(PCRE模式)。


此变体捕获两个部分,检查它们之间并接受任何行开头。

/^(\$\d{1,3}\.\d{1,2})(?:\h*\R((?:^.+\R)+?)(?=(?1)))?/m
  • (?1)subroutine call的第一个组的模式,以在两者之间进行检查。

See another demo at regex101(同样是PCRE模式)。

答案 1 :(得分:2)

您可以将最后一个捕获组转换为正向超前,并添加一个替代字符串以匹配字符串结尾:

(\$[0-9]{1,3}\.[0-9]{1,2})\s*(?<Text>.*?)(?=\$[0-9]{1,3}\.[0-9]{1,2}|$)
                                         ^^^                        ^^ 

请参见regex demo

(?=\$[0-9]{1,3}\.[0-9]{1,2}|$)正向查找要求\$[0-9]{1,3}\.[0-9]{1,2}$,一到三位数,.,一位或两位数)或(|  字符串($的末尾立即显示在当前位置的右侧。