我正在创建一个正则表达式来处理从文件中读取的下面一行。
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\.])
建议和贡献将受到高度赞赏。
答案 0 :(得分:2)
有问题的正则表达式很可能是使用正则表达式构建器创建的。
这是您的正则表达式简化为其组成部分,简化并支持两种有效字符串变体。
未完成验证的日期(仍有可能是月内无效天数):
(?:0?[1-9]|[12]\d|3[01])[-:\/.](?:0?[1-9]|1[012])[-:\/.](?:19|20)\d\d
日期和时间之间的空格:
[\t ]+
\s
也会匹配换行符和其他不经常使用的空格,这就是我使用[\t ]+
代替\s
的原因。
时间至少为小时和分钟且未完成验证(闰秒,上午或下午时间无效):
(?:[01]?\d|2[0-3]):[0-5][0-9](?::[0-5][0-9])?(?:[\t ]?(?:am|AM|pm|PM))?
空白,4位数字,6个星号,4位数字,空格:
[\t ]+\d{6}\*{6}\d{4}[\t ]+
可选择包含13位数字的数字未标记为反向引用:
(?:\d{13}[\t ]+)?
具有未确定位数,空格,可选加号或减号,浮点数(不带指数)的数字:
No\d+[\t ]+[+-]?[\d,.]+
以下是整个表达式,另外添加了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
可用于引用整个找到的字符串的这一部分。
提示:(
... )
是一个标记组。 (?:
... )
是一个非标记组,因为在打开括号后会立即显示?:
。