2

好的,我需要改进这个问题。让我再试一次:

我需要解析出机场代码之后的飞行时间,但两者之间可能有一个数字和空格。

示例数据:

ORD  1100
HOU 1 1215
MAD   4  1300

我试过这个:

([A-Z]{3})\s?\d?\s?(\d{4})

我最终得到机场代码和一个数字。我需要一个正则表达式,它会忽略机场代码之后的所有内容,除了 4 位数的飞行时间。

希望我改进了我的问题。

4

3 回答 3

2

解决方案可能很简单:

\d{4}

根据您的输入,您不需要关心前面的数字..

于 2012-10-08T17:53:12.520 回答
1

这里有一些东西,使用lookbehindlookahead来确保只有4个数字,它们周围没有数字(或开始/结束)。

"(?<=[^\d]|^)\d{4}(?=[^\d]|$)"

这两个[^\d]可以替换[\s]为仅匹配 4 位数字和周围的空格。

更新: 随着您的最新更新,我将我的正则表达式与您的(来自评论)合并并提出了这个:

"(?<=[A-Z]{3}\s(\d\s)?)\d{4}(?=\s|$)"

该模式分为三个部分。首先是回顾(?<=PatternHere)。这里面的模式必须在我们寻找之前出现/匹配。

下一部分是我们简单的主要模式:\d{4},四位数字。

最后一部分是lookahead : ,它与lookbehind(?=PatternHere)几乎相同,但检查另一边,forward

于 2012-10-08T18:08:43.767 回答
1

这是我会使用的答案:

@"([A-Z]{3})\s+(?:[0-9]\s+)?([0-9]{4})"

基本上它与您尝试做的非常相似。

第一部分是([A-Z]{3}),它查找 3 个大写字母并将它们分配给组 1(组 0 是整个字符串)。

第二部分是\s+(?:[0-9]\s+)?,它至少需要一个空格,其中某处可能有 1 位数字。中间的非捕获组要求如果那里有单个数字,则必须在其后至少有 1 个空格。这可以防止类似ABC 12345.

接下来我们有([0-9]{4}),它只是匹配您要查找的 4 位数字。这些可以在第 2 组中找到。我在这里使用 [0-9] 因为\d指的是比我们习惯的数字更多的数字(如东方阿拉伯数字)。

于 2012-10-09T13:16:27.287 回答