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

Regex to find blocks of text between $ sign

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

.33  
1  
0000  
0000  
Some Text 1 line1  
Some Text 1 line2  
[=10=].00  
123A  
some Text 2  
.34  
000  
some text 3  
.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?

是否也可以获取即时文本块?

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

($[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}$,一到三位数,.,一或两位数)或(| ) 字符串结尾 ($) 立即出现在当前位置的右侧。

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

/^$\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

See another demo at regex101(PCRE 模式也是如此)。