需要捕获单个字符,但忽略数字

时间:2012-10-24 19:31:40

标签: regex

我正在解析航班信息。

以下是样本数据:

E0.777 7     3:09
E0.319 N     1:43
E0.735 8     1:45
E0.735 N     1:48
E0.M80 9 3:21
E0.733       1:48

我需要填充这样的字段:

Equipment: 735
On Time: N
Duration: 1:48

我遇到的问题是捕捉Y或N字符但忽略单个数字,然后捕捉持续时间。

这是我试过的表达方式:

@"^.{3}(.{3})\s?([N|Y]?)?(?:[0-9]\s+)?(\w{4})"

编辑:我更新了示例数据以澄清我的问题。设备并不总是三位数,可以是一个字符和两位数。设备和持续时间之间的数据可以是布尔N或Y,单个数字或空白。只应捕获布尔值。

4 个答案:

答案 0 :(得分:6)

首先,您混合了交替和字符类的概念[Y|N]将匹配3个不同的字符:Y|N。使用(...)或遗漏管道。

其次你在角色类之后的双?没有真正做任何事情。第三,最后,如果找到数字,则只匹配连续的空格。但如果没有数字,则最后?将忽略子模式,因此也不允许使用空格。

最后,\w:不匹配。

试试这个:

@"^.{3}(\d{3})\s?(?:([NY])|\d)\s+(\d:\d\d)"

您还应该考虑将开头的重复.限制为更精确的字符类(即\w{2}\.,但我不知道那里的可能性。)

答案 1 :(得分:2)

@"^..\.(\d{3})\s(?:([YN])|\d)\s*(\S{4})"
  • .{3}更改为..\.,这更加明确了字符3的文字.
  • (?:([YN])|\d)匹配Y / N或数字,但仅捕获Y或N.请注意,[YN]不是[Y|N]
  • \w{4}更改为\S{4},因为\w与冒号:不匹配。

答案 2 :(得分:0)

这会捕获所有带有Y或N的行并忽略其他所有行:

^...(\d{3})\s*([YN])\s*(\d+:\d+)

答案 3 :(得分:0)

这样做......

^\w\d\.(\d{3})\s(?:([YN])|\d)\s*(\d:\d{2})$

我对你的正则表达式进行了一些其他修改,因为我更容易根据你的数据重写它然后尝试修改你的内容。

这将捕获Y或N,否则它将不会捕获该组中的任何内容。我还试着更具体地说明你的持续时间正则表达式。

更新:这适用于您的新要求......

^\w\d\.(\w{3})\s(?:([YN])|\d|\s)\s*(\d:\d{2})$

您可以在此处看到它处理您的数据... http://regexr.com?32j1b

(将鼠标悬停在每一行以查看匹配的组)

相关问题