我正在解析航班信息。
以下是样本数据:
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,单个数字或空白。只应捕获布尔值。
答案 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
(将鼠标悬停在每一行以查看匹配的组)