3

我正在解析航班信息。

这是示例数据:

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

4 回答 4

6

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

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

最后,\w不匹配:

尝试这个:

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

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

于 2012-10-24T19:37:55.250 回答
2
@"^..\.(\d{3})\s(?:([YN])|\d)\s*(\S{4})"
  • 更改.{3}..\.更具体的关于.字符 3 的文字。
  • (?:([YN])|\d)匹配 Y/N 或数字,但仅捕获 Y 或 N。请注意,它[YN]不是[Y|N].
  • 更改\w{4}\S{4}since\w不匹配冒号:
于 2012-10-24T19:37:53.840 回答
0

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

^...(\d{3})\s*([YN])\s*(\d+:\d+)
于 2012-10-24T19:39:18.693 回答
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

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

于 2012-10-24T19:42:54.790 回答