我的反向参考正则表达式有什么问题?

时间:2018-11-03 22:39:04

标签: regex

我正在尝试使用正则表达式,使用组和反向引用来捕获发票字段的值,但是我只能看到第一个组,并且只有在使用\2进行引用时,才能看到它。

要分析的文本:

  

财政发票
  序列号和号码发票:BIC 15
  日期:2015年1月13日

我的正则表达式是: ([Ii]nv\w*:\s)(.*)\1

表达似乎井然有序,但没有结果。我是regex的新手,请告诉我,我该怎么做?

1 个答案:

答案 0 :(得分:0)

我认为您需要此正则表达式:

".*?[iI]nvoice:\s?(.*?)s?"

它首先匹配一个双quote,然后匹配任意数量的任何字符,然后再匹配'Invoice:',然后匹配一个可选的空白,然后创建一个Group 1任何字符的数量,最后是一个可选的空格和双引号。

您想要的结果在组1中。

修改

以防万一,您坚持使用反向引用,这也可以:

".*?([Ii]nv\w*).*?\1:\s(.*?)\s?"

首先从匹配双精度quote开始,然后匹配任意数量的any char(非贪婪),然后创建一个Group 1,匹配'Inv'和任意数量的{{1 }}字符,然后匹配任意数量的Word(非贪婪),然后匹配any char,后跟冒号(可选的空格),然后创建与任意数量的任何字符匹配的Group 2,直到它找到最佳空格,最后找到双引号。

您想要的结果将在第2组中(后向引用在第1组中)。

根据评论

编辑(不带引号和3行):

backreference

首先从匹配[iI]nvoice:\s?([^\r\n]*)\r?\nDate:\s([\d\.]*) :'(可选的白色'Invoice)开始,然后创建与行的其余部分匹配的Space。然后匹配以Group 1:'结尾的行和可选的白色'Date。然后创建Space,匹配任意数量的Group 2digits

您将在dots中获得发票编号,并在Group 1中获得日期。