正则表达式 JavaScript 调优



正则表达式的第一步,并一直试图从正在获取的电子邮件中获取一些值。到目前为止,我已经取得了一些成就(即使不是最好的方法(,但需要更多的价值,并且不知道如何获得它们。

这是或多或少总是相同的电子邮件模板:

London, 06/20/09
Mr. Tom Waits
Process ref.: CR // 1943061
Your reference: 338256
Clients' names: Mary Lamb, John Snow
We return to your contact regarding the complaint on behalf of the clients mentioned above.
We inform you that the refund process has already started, so you should receive the respective amount (375EUR) within 4/6 weeks.
Payment ref.: 2500062960.
Our compliments,(...)

我需要什么:

  • "伦敦"之后的日期,
  • 流程参考(2 个字母 +//+ 数字(
  • 您的参考编号
  • 客户姓名
  • 付款参考号

注意金额并不总是在"( ("之间,有时它前面是"金额",有时是"金额",有时"EUR"用空格分隔,但所需的值始终是段落上的第一个数字组合

到目前为止,我拥有的:

(?:London,)(.*)s+(?:Mr. Tom Waits)s+(?:Process ref.:)s+(....d+)s+(?:Your reference:)s+(d+)s+(?:Clients' names:)s+(.*)s+

它检索的内容:

  • "伦敦"之后的日期,
  • 流程参考(2 个字母 +//+ 数字(
  • 您的参考编号
  • 客户姓名

缺少什么:

  • 付款参考号

其他问题:

  • 我试图排除"先生"parapraph,但我认为当他们写得有点不同时可能会出现问题,比如额外的空格或其他东西
  • 如果他们编写的项目也略有不同,例如,"过程引用"而不是"过程引用",则可能会出现相同的问题。

提前谢谢。

这将是一个沉重的正则表达式。我确实希望您不要在大文件上尝试此正则表达式,而是在一个单一条目上尝试(就像您在帖子中显示的条目一样(。

无论如何,这是正则表达式-

London, ([d/]+)[nwW]*?Process ref(?:.|erence): ([A-Z /d]+)[nwW]*?Your ref(?:.|erence): (d+)[nwW]*?Client(?:s'|'s) name(?:s)?: ([w ,]+)[nwW]*?amount.*?(d+)[nwW]*?Payment ref(?:.|erence): (d+)

这应该是相当宽松的,它不依赖于许多可变(看似(的东西,除了London,这是一个有点硬编码,但我假设它总是London

现在,让我们走过这个——

  • London, ([d/]+)- 这基本上与London, DATE匹配 - 其中日期是一个日期,其中日期的每个元素都用/分隔。

    在这种情况下,它匹配London, 06/20/09中的06/20/09

  • [nwW]*?- 试着跟上这个 - 我经常使用它。

    这将以非贪婪的方式匹配几乎所有新行、单词字符和非单词字符。在这种特殊情况下,这将匹配几乎所有内容,包括换行符。这用于跳过任何内容,直到我们到达所需的位置。

  • Process ref(?:.|erence): ([A-Z /d]+)- 捕获进程引用,它可以由大写字母(我假设,您可以更改(、斜杠 (/( 和数字组成

    适用于ref.reference

    在这种情况下,它匹配CR // 1943061,来自Process ref.: CR // 1943061

  • [nwW]*?- 忽略所有内容,直到下一个令牌

  • Your ref(?:.|erence): (d+)- 捕获"您的参考",可以由数字组成

    适用于ref.reference

    在这种情况下,它与338256匹配

  • [nwW]*?- 忽略所有内容,直到下一个令牌

  • Client(?:s'|'s) name(?:s)?: ([w ,]+)- 捕获客户端名称
  • - 已修改,因此它也支持单个客户端名称。(查看演示(。名称列表可以由单词字符、空格和逗号组成。

    在这种情况下,它从Clients' names: Mary Lamb, John Snow捕获Mary Lamb, John Snow

  • (d+)- 捕获数字 - 这是一个很大的假设,我假设客户名称列表之后出现的唯一数字是金额的数字。如果不是

  • [nwW]*?- 忽略所有内容,直到下一个令牌

  • amount.*?(d+)- 捕获amount之后显示的第一组数字。这是一个假设,我假设amount词实际上存在于该段落中。

    在这种情况下,它从amount (375EUR)捕获375

  • [nwW]*?- 忽略所有内容,直到下一个令牌

  • Payment ref(?:.|erence): (d+)- 捕获付款参考号,该参考号可以由数字组成

    适用于ref.reference

    在这种情况下,它从Payment ref.: 2500062960.捕获2500062960

查看演示!

最新更新