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有一个文本
    的更具体一点
  • (?:([YN])|\d)
    匹配Y/N或数字,但只捕获Y或N。请注意,它是
    [YN]
    而不是
    [Y | N]
  • 已将
    \w{4}
    更改为
    \S{4}
    ,因为
    \w
    与冒号不匹配

首先,您混淆了交替的概念,字符类将匹配3个不同的字符:
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。在我的答案中添加了另一个正则表达式以满足您的新要求无问题。很高兴我能帮忙。