Regex 需要捕获单个字符,但忽略数字
我正在分析航班信息 以下是示例数据:Regex 需要捕获单个字符,但忽略数字,regex,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]?)?(?:
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、单个数字或空白。只应捕获布尔值
@"^..\.(\d{3})\s(?:([YN])|\d)\s*(\S{4})"
- 将
更改为{3}
,这是关于字符3有一个文本.\.
的更具体一点
匹配Y/N或数字,但只捕获Y或N。请注意,它是(?:([YN])|\d)
而不是[YN]
[Y | N]
- 已将
更改为\w{4}
,因为\S{4}
与冒号不匹配\w
:
Y
或
或N
。要么使用(…)
,要么不使用管道
其次,character类之后的double?
实际上没有任何作用。第三,在最后,如果找到一个数字,则只匹配连续的空格。但是如果没有数字,最后一个?
将忽略子模式,因此也不允许使用空格
最后,\w
与:
不匹配
试试这个:
@"^.{3}(\d{3})\s?(?:([NY])|\d)\s+(\d:\d\d)"
您还应该考虑将开始时重复的
限制为更精确的字符类(即\w{2}\.
,但我不知道其中的可能性)。这将捕获所有带有Y或N的行,并忽略其他所有内容:
^...(\d{3})\s*([YN])\s*(\d+:\d+)
这样就可以了
^\w\d\.(\d{3})\s(?:([YN])|\d)\s*(\d:\d{2})$
我对你的正则表达式做了一些其他的修改,因为我更容易根据你的数据重写它,然后尝试修改你所拥有的
这将捕获Y或N,或者不会捕获该组中的任何内容。我也试着更具体地使用你的duration regex
更新:这适用于您的新需求
^\w\d\.(\w{3})\s(?:([YN])|\d|\s)\s*(\d:\d{2})$
你可以在这里看到它正在处理你的数据
(将鼠标悬停在每行上以查看匹配的组)数据中的
N
、7
和8
代表什么?为什么你有时会忽略它?我在这里有点迷茫,你是想用一个正则表达式捕获输出的每个单独部分吗?看起来你需要三个正则表达式。看起来您在那里有一个非捕获组(?:[0-9]\s+)
。如果你想忽略[0-9]
,你可以试试[^0-9]
。@Xymostech:大概N
意味着航班不准时,7
或8
(或其他)意味着航班准时并且在7号门或8号门(或其他)。我想你不需要在第一次\s
之后的?
。我假设那里总是会有空白,我假设?
本来就在那里,因为它在哪里匹配比较混乱。我不知道。我只是假设OP把它放在那里是有原因的(毕竟我们不知道完整的输入文件),我很接近。此表达式适用于除一行以外的所有数据:.{3}(.{3})\s(?:([YN])|\d |\s)\s*(\d:\d{2})$。这是数据行不工作:E0.M80 9 3:21。在我的答案中添加了另一个正则表达式以满足您的新要求无问题。很高兴我能帮忙。