好的,我需要改进这个问题。让我再试一次:
我需要解析出机场代码之后的飞行时间,但两者之间可能有一个数字和空格。
示例数据:
ORD 1100
HOU 1 1215
MAD 4 1300
我试过这个:
([A-Z]{3})\s?\d?\s?(\d{4})
我最终得到机场代码和一个数字。我需要一个正则表达式,它会忽略机场代码之后的所有内容,除了 4 位数的飞行时间。
希望我改进了我的问题。
解决方案可能很简单:
\d{4}
根据您的输入,您不需要关心前面的数字..
这里有一些东西,使用lookbehind和lookahead来确保只有4个数字,它们周围没有数字(或开始/结束)。
"(?<=[^\d]|^)\d{4}(?=[^\d]|$)"
这两个[^\d]
可以替换[\s]
为仅匹配 4 位数字和周围的空格。
更新: 随着您的最新更新,我将我的正则表达式与您的(来自评论)合并并提出了这个:
"(?<=[A-Z]{3}\s(\d\s)?)\d{4}(?=\s|$)"
该模式分为三个部分。首先是回顾:(?<=PatternHere)
。这里面的模式必须在我们寻找之前出现/匹配。
下一部分是我们简单的主要模式:\d{4}
,四位数字。
最后一部分是lookahead : ,它与lookbehind(?=PatternHere)
几乎相同,但检查另一边,forward。
这是我会使用的答案:
@"([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
指的是比我们习惯的数字更多的数字(如东方阿拉伯数字)。