我试图创建一个正则表达式模式来捕获我的信用卡发票信息,我只能以PDF格式获得。我将文本复制到文本编辑器,然后使用notepad++中的替换工具将复制的文本转换为CSV文本。
我遇到了负值的问题。
给定这段文本:
16/04 RC GRACAS 2 - 0,02
SAÚDE .RECIFE
16/04 RC GRACAS 2 02/03 45,97
SAÚDE .RECIFE
上面的文本包含2个清单数据的数据。正则表达式应该在第一个条目中捕获以下组:
"16/04": date
"RC GRACAS 2": description
"-": value sign
"0,02": value
"SAÚDE .RECIFE": categories
以及第二个条目中的以下组:
"16/04": date
"RC GRACAS 2 02/03": description
"": value sign
"45,97": value
"SAÚDE .RECIFE": categories
我现在的正则表达式是这样的:^(\d{2}/\d{2})\s+(.*)\s+([-+]?)\s?(\d{1,3}(?:\.\d{3})*(?:,\d+)?)\s+(.*)?
我遇到的问题是,在第一次购买中,正则表达式无法捕获减号,它成为第二组(描述)的一部分。
我怎样才能改变这个正则表达式来在它自己的组中捕获那个符号?
4条答案
按热度按时间bmvo0sr51#
使用 * reliable * 量词
.*?
,它匹配尽可能少的 * 字符,并使用[\r\n]
匹配新行:参见live demo。
olhwl3o22#
问题是描述组太一般化(并且也匹配下一个组的模式),并且符号组是可选的,因此它被描述捕获。真正造成问题的是,在符号组的右侧还有另一个可选的
.*
组。您可以通过对正则表达式进行两个简单的更改来解决这个问题。第一种是使描述组变懒(通过在
*
之后添加?
)。第二个是在表达式中添加一个结束行$
:对惰性组的更改可以防止描述字段传递到下一个组中,并且结束行为表达式添加了更多的结构,从而允许惰性工作。
kx1ctssn3#
.
匹配所有内容,包括-
和+
。如果你的描述保证没有连字符和加号,你可以通过将第二组改为([^-+]*)
来防止它们与这两个匹配:试试on regex101.com。
或者,我的建议是:
试试on regex101.com。
bq8i3lrv4#
可以使用以下正则表达式。
Demo
如果未指定自由间距模式,则将
如果使用编号的捕获组,则这将是