忽略正则表达式匹配中的整数

时间:2014-08-10 11:20:48

标签: regex pattern-matching

我正在创建一个正则表达式来处理从文件中读取的下面一行。

  

30/05/2014 17:58:19 418087 ****** 2093 No415000345536 5,000.00

我已经成功创建了正则表达式,但我的问题是字符串有时可能会显示如下,稍加一些(粗体突出显示)

  

31/05/2014 15:06:29 410741 ****** 7993 0027200004750 No415100345732 1,500.00

请协助更改模式以忽略我不需要的13位数的整数。

以下是我的正则表达式

  

((?:(?:[0-2]?\d{1})|(?:[3][01]{1}))[-:\/.](?:[0]?[1-9]|[1][012])[-:\/.](?:(?:[1]{1}\d{1}\d{1}\d{1})|(?:[2]{1}\d{3})))(?![\d])(\s+)((?:(?:[0-1][0-9])|(?:[2][0-3])|(?:[0-9])):(?:[0-5][0-9])(?::[0-5][0-9])?(?:\s?(?:am|AM|pm|PM))?)(\s+)(\d{6})(\*{6})(\d{4})(\s+)(No)(\d+)(\s+)([+-]?\d*\.\d+)(?![-+0-9\.])

建议和贡献将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

有问题的正则表达式很可能是使用正则表达式构建器创建的。

这是您的正则表达式简化为其组成部分,简化并支持两种有效字符串变体。

  1. 未完成验证的日期(仍有可能是月内无效天数):

    (?:0?[1-9]|[12]\d|3[01])[-:\/.](?:0?[1-9]|1[012])[-:\/.](?:19|20)\d\d
    
  2. 日期和时间之间的空格:

    [\t ]+
    

    \s也会匹配换行符和其他不经常使用的空格,这就是我使用[\t ]+代替\s的原因。

  3. 时间至少为小时和分钟且未完成验证(闰秒,上午或下午时间无效):

    (?:[01]?\d|2[0-3]):[0-5][0-9](?::[0-5][0-9])?(?:[\t ]?(?:am|AM|pm|PM))?
    
  4. 空白,4位数字,6个星号,4位数字,空格:

    [\t ]+\d{6}\*{6}\d{4}[\t ]+
    
  5. 可选择包含13位数字的数字未标记为反向引用:

    (?:\d{13}[\t ]+)?
    
  6. 具有未确定位数,空格,可选加号或减号,浮点数(不带指数)的数字:

    No\d+[\t ]+[+-]?[\d,.]+
    
  7. 以下是整个表达式,另外添加了2对括号,以标记真正感兴趣的字符串以供进一步处理。

    ((?:0?[1-9]|[12]\d|3[01])[-:\/.](?:0?[1-9]|1[012])[-:\/.](?:19|20)\d\d[\t ]+(?:[01]?\d|2[0-3]):[0-5][0-9](?::[0-5][0-9])?(?:[\t ]?(?:am|AM|pm|PM))?[\t ]+\d{6}\*{6}\d{4}[\t ]+)(?:\d{13}[\t ]+)?(No\d+[\t ]+[+-]?[\d,.]+)
    

    第一个标记组匹配:

    30/05/2014 17:58:19 418087******2093 
    31/05/2014 15:06:29 410741******7993 
    

    \1$1可用于引用整个找到的字符串的这一部分。

    第二个标记组匹配:

    No415000345536 5,000.00
    No415100345732 1,500.00
    

    \2$2可用于引用整个找到的字符串的这一部分。

    提示:( ... )是一个标记组。 (?: ... )是一个非标记组,因为在打开括号后会立即显示?:

相关问题