我正在尝试提取美元价值之间的文本块。例如下面的文本:
$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块?
是否也可以立即获得文本块?
答案 0 :(得分:3)
一个想法,如果其他行在行首不包含$
,则仅提取数字行之后的部分。它不检查匹配项是否在两个$
位数字行之间。
/^\$\d{1,3}\.\d{1,2}\h*\R\K(?:^[^$].+\R)+/m
\h
与horizontal white-space匹配\K
resets beginning \R
匹配任何换行序列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}
($
,一到三位数,.
,一位或两位数)或(|
字符串($
的末尾立即显示在当前位置的右侧。