regex 正则表达式在谷歌脚本检索数字后的特定单词

rseugnpd  于 2023-02-14  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个谷歌应用程序脚本,解析一些PDF文件,我开始与以下正则表达式,检索5组3digits从Reference标签:

[w,W,s,S]*(\d{3}).?(\d{3}).?(\d{3}).?(\d{3}).?(\d{3})

我添加到它更多的通用性,也检索9位数组合的Reference标签;

[w,W,s,S]*(\d{3}).?(\d{3}).?(\d{3}).?(\d{3})?.?(\d{3})?

两个版本都只匹配数字,没有单词,这很完美。

    • 我还想检索与Amount标记相关的数字,同时忽略其间的任何单词和数字。但在这里我遇到了一些麻烦。**

我试过:

.*?(?:Ref)(?:.*:) ? ?(\d{3}).?(\d{3}).?(\d{3}).?(\d{3})?.?(\d{3})?

但它已经开始包括这个词。
这是使用正则表达式的文本的一些虚拟文本示例:

  • 可以在每个"标记"后包含更多单词(例如:* 一米三米一x *//*一米四米一x *:)
  • 是否可以具有:
Some dummy text that may have words in common like `reference` or `amount` throughout the document

Reference: 245 154 343 345 345
Entity: 34567    
Amount: 11,11
Payment date: 14/07/2022

Some more text

提前感谢您的帮助。

eit6fx6z

eit6fx6z1#

您可以使用:

^Reference:?[\t ]+(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})(?:\n(?!Amount)\S.*)*\nAmount:?[\t ]+(\d+(?:,\d+)?)\b

参见regex101 demo
或者考虑到Reference of something // Amount of first payment:,可以使用[^\d\n]*匹配除数字或换行符以外的任何字符:

^Reference\b[^\d\n]*[\t ](\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})(?:\n(?!Amount\b)\S.*)*\nAmount\b[^\d\n]*[\t ](\d+(?:,\d+)?)\b
    • 说明**
  • ^字符串开始
  • 匹配单词Reference
  • [^\d\n]*[\t ]匹配数字或换行符以外的可选字符,然后匹配空格或制表符 (您也可以使用\s*,但也可能匹配换行符)
  • (\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})[\t ]*(\d{3})将捕获group 1与捕获group 5相匹配,捕获的数字之间有空格或制表符
  • (?:非夺获组
  • \n(?!Amount\b)匹配一个换行符,并Assert不是右边的单词Amount
  • \S.*匹配非空白字符,后跟该行的其余部分
  • )*关闭非捕获组并选择重复此操作
  • 匹配换行符和单词Amount
  • [^\d\n]*[\t ]匹配除数字或换行符以外的可选字符,然后匹配空格或制表符
  • (\d+(?:,\d+)?)捕获组6,匹配1+位数,并可选地匹配逗号与1+位数
  • \b防止部分字匹配的字边界

参见另一个regex101 demo

相关问题