【问题标题】:Conditional regex for .Net, check if (condition){match pattern}else{match else pattern}.Net 的条件正则表达式,检查 if (condition){match pattern}else{match else pattern}
【发布时间】:2018-11-21 01:00:59
【问题描述】:

我必须在下面包含账单日期的短信中搜索到期日。

"Bill dated 27-May-18 for your airtel fixedline/broadband ID ##### has been sent at abc@abc.com from ebill@abc.com. Due amount: Rs 2,358.82, due date: 15-Jun-18"

可能有许多不同的短信,其中可能没有在短信中明确提及计费日期或到期日。所以之前,我们只是通过正则表达式寻找日期格式,

"((\d{4}|\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{4}|\d{2}))|((\d{4}|\d{2})-\d{2}-(\d{4}|\d{2}))|((\d{4}|\d{2})\/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\/(\d{4}|\d{2}))|((\d{4}|\d{2})\/(\d{3}|\d{2})\/(\d{4}|\d{2}))|([0-3][0-9]((st)|(nd)|(rd)|(th))((\s)?)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))" 

当只有到期日而没有账单日期时,它运作良好。但在上面的短信中,它总是返回账单日期而不是到期日。

我想找到一个解决方案,它总是会像上面的正则表达式一样返回日期,或者如果提到任何到期日期,那么它应该在到期日期旁边返回日期。

我看到的可能解决方案是

  1. 检查截止日期 -(截止日期:)
  2. 如果在到期日旁边找到返回日期 - (?
  3. else 2 not found 然后返回我使用上述正则表达式存在的任何日期格式

【问题讨论】:

  • 给你(?:.*duedate:\s*(15-Jun-18)|(otherdate)).* 的影响延伸到两个世界neo。
  • 使用this regex。如果文本跨越多行,您可能还想使用RegexOptions.Singleline。请注意,您需要 .* 在第一个日期捕获模式的两端使用整个字符串。另外,仅供参考,您无需在 .NET 正则表达式中转义 /
  • @sln 感谢您的回复。我是正则表达式的初学者。你能请我,我怎样才能构造一个正则表达式,检查短信中是否存在“到期日期:”文本,在“到期金额:”旁边的其他返回日期旁边返回日期,我试过这个,(?(到期date: )((?
  • @wiktor,感谢您的回复。我是正则表达式的初学者。你能请我,我怎样才能构造一个正则表达式,检查短信中是否存在“到期日期:”文本,在“到期金额:”旁边的其他返回日期旁边返回日期,我试过这个,(?(到期date: )((?
  • @sln 我无法让你的正则表达式为我工作。你能详细点吗?它似乎更接近我需要的东西

标签: .net regex


【解决方案1】:

您所要做的就是将due date 设为可选[\S\s]due date
这将从字符串的末尾开始,然后回溯,直到找到它
然后匹配它之后的日期。

如果没有找到,它在字符串中找到的第一个 date 将被匹配。

判断它是否匹配 due date 检查组 1 是否匹配。
如果为空,则不匹配。

正则表达式:

@"(?:[\S\s]*(due\s+date\s*:)\s*)?((\d{4}|\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{4}|\d{2}))|((\d{4}|\d{2})-\d{2}-(\d{4}|\d{2}))|((\d{4}|\d{2})/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/(\d{4}|\d{2}))|((\d{4}|\d{2})/(\d{3}|\d{2})/(\d{4}|\d{2}))|([0-3][0-9]((st)|(nd)|(rd)|(th))((\s)?)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))"

可读版本:

    (?:
         [\S\s]*  
         ( due \s+ date \s* : )        # (1)
         \s* 
    )?

    (                             # (2 start)
         ( \d{4} | \d{2} )             # (3)
         -
         (                             # (4 start)
              Jan
           |  Feb
           |  Mar
           |  Apr
           |  May
           |  Jun
           |  Jul
           |  Aug
           |  Sep
           |  Oct
           |  Nov
           |  Dec
         )                             # (4 end)
         -
         ( \d{4} | \d{2} )             # (5)
    )                             # (2 end)
 |  (                             # (6 start)
         ( \d{4} | \d{2} )             # (7)
         - \d{2} -
         ( \d{4} | \d{2} )             # (8)
    )                             # (6 end)
 |  (                             # (9 start)
         ( \d{4} | \d{2} )             # (10)
         /
         (                             # (11 start)
              Jan
           |  Feb
           |  Mar
           |  Apr
           |  May
           |  Jun
           |  Jul
           |  Aug
           |  Sep
           |  Oct
           |  Nov
           |  Dec
         )                             # (11 end)
         /
         ( \d{4} | \d{2} )             # (12)
    )                             # (9 end)
 |  (                             # (13 start)
         ( \d{4} | \d{2} )             # (14)
         /
         ( \d{3} | \d{2} )             # (15)
         /
         ( \d{4} | \d{2} )             # (16)
    )                             # (13 end)
 |  (                             # (17 start)
         [0-3] [0-9] 
         (                             # (18 start)
              ( st )                        # (19)
           |  ( nd )                        # (20)
           |  ( rd )                        # (21)
           |  ( th )                        # (22)
         )                             # (18 end)
         (                             # (23 start)
              ( \s )?                       # (24)
         )                             # (23 end)
         (                             # (25 start)
              Jan
           |  Feb
           |  Mar
           |  Apr
           |  May
           |  Jun
           |  Jul
           |  Aug
           |  Sep
           |  Oct
           |  Nov
           |  Dec
         )                             # (25 end)
    )                             # (17 end)

输出

 **  Grp 0 -  ( pos 0 : len 159 ) 
Bill dated 27-May-18 for your airtel fixedline/broadband ID ##### has been sent at abc@abc.com from ebill@abc.com. Due amount: Rs 2,358.82, due date: 15-Jun-18  
 **  Grp 1 -  ( pos 140 : len 9 ) 
due date:  
 **  Grp 2 -  ( pos 150 : len 9 ) 
15-Jun-18  
 **  Grp 3 -  ( pos 150 : len 2 ) 
15  
 **  Grp 4 -  ( pos 153 : len 3 ) 
Jun  
 **  Grp 5 -  ( pos 157 : len 2 ) 
18  
 **  Grp 6 -  NULL 
 **  Grp 7 -  NULL 
 **  Grp 8 -  NULL 
 **  Grp 9 -  NULL 
 **  Grp 10 -  NULL 
 **  Grp 11 -  NULL 
 **  Grp 12 -  NULL 
 **  Grp 13 -  NULL 
 **  Grp 14 -  NULL 
 **  Grp 15 -  NULL 
 **  Grp 16 -  NULL 
 **  Grp 17 -  NULL 
 **  Grp 18 -  NULL 
 **  Grp 19 -  NULL 
 **  Grp 20 -  NULL 
 **  Grp 21 -  NULL 
 **  Grp 22 -  NULL 
 **  Grp 23 -  NULL 
 **  Grp 24 -  NULL 
 **  Grp 25 -  NULL 

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多