正则表达式提取字符串之间的数据
Posted
技术标签:
【中文标题】正则表达式提取字符串之间的数据【英文标题】:Regex to extract data in between string 【发布时间】:2021-01-09 11:38:36 【问题描述】:我尝试了下面的 ff 正则表达式,但它似乎不起作用。我想提取 F. Prepaids 和 G. Initial Escrow Payment 之间的数据,并得到下面的 ff 示例结果。谢谢。
#我的正则表达式
(?<=F. Prepaids)[\S\s]*?(?= G. Initial Escrow Payment)
#字符串
F. Prepaids $887.01
01 Homeowner's Insurance Premium ( 12 mo.) toAmerican Family $893.00
Insura
02 Mortgage Insurance Premium ( mo.)
03 Prepaid Interest ($5.99 per day from 10/02/2020 to 10/01/2020) -$5.99
04 Property Taxes ( mo.)
05
06
07
08
G. Initial Escrow Payment at Closing $3,776.11
如果我得到介于两者之间的数据,我还想要一个正则表达式来获得 ff 结果,其中其他数据包括基于上述字符串的新行。
Homeowner's Insurance Premium ( 12 mo.) to American Family Insura
Mortgage Insurance Premium ( mo.)
Prepaid Interest ($5.99 per day from 10/02/2020 to 10/01/2020)
Property Taxes ( mo.)
对这个有什么想法吗?谢谢。
【问题讨论】:
要获取中间的内容,请省略 G 之前的空格。 什么意思? G前面的lookahead中有一个空格。见regex101.com/r/n6PgvI/1 使用(?<=F. Prepaids)[\S\s]*?(?=G. Initial Escrow Payment)
试试this regex
【参考方案1】:
你可以使用
(?m)(?<=F\. Prepaids[\s\S]*?^\d+ )[^\r\n]+(?:\r?\n[^\n\d][^\r\n]*)?(?=[\s\S]*?\nG\. Initial Escrow Payment)
见regex demo
详情
(?m)
- 开启多行模式
(?<=F\. Prepaids[\s\S]*?^\d+ )
- 匹配紧接在 F. Prepaids
前面的位置,然后是尽可能少的任何零个或多个字符,然后是行首的 1+ 个数字,然后是空格
[^\r\n]+
- 除 CR 和 LF 之外的任何一个或多个字符和
(?:\r?\n[^\n\d][^\r\n]*)*
- 零个或多个 CRLF 或 LF 结尾序列,任何非数字和非换行符,然后是除换行符和回车之外的任何零个或多个字符
(?=[\s\S]*?\nG\. Initial Escrow Payment)
- 当前位置必须跟在后面
[\s\S]*?
- 尽可能少的零个或多个字符
\n
- 换行符
G\. Initial Escrow Payment
- G. Initial Escrow Payment
文本。
【讨论】:
但是有一个文本被附加在下一行,例如对于第一个数字,输出应该是“美国家庭保险的房主保险费(12 个月)”,该保险在下一行,893.00 美元的钱被删除了。 ***.com/questions/64026623/… @MrDave 您无法在一次匹配操作中匹配不连续的文本。这就是您使用单个匹配/提取选项所能做的一切。不,regex101 不支持 .NET 语法。 @MrDave 您无法在一次匹配操作中匹配不连续的文本。。或者使用替换。你试过用替换吗? @MrDave 我不知道“似乎不起作用”是什么意思。正如你在我的演示中看到的,从Homeowner's Insurance Premium ( 12 mo.) toAmerican Family $893.00\r\nInsura
字符串,你得到Homeowner's Insurance Premium ( 12 mo.) toAmerican Family Insura
字符串,以上是关于正则表达式提取字符串之间的数据的主要内容,如果未能解决你的问题,请参考以下文章
java如何用正则表达式提取#之间的字符串。例如cc#aaaaa#jdi#bbbbb#ji,需要提取aaaaa和bbbbb两个字符串。