需要C#Regex匹配四位数序列,但忽略任何单个数字

时间:2012-10-08 17:51:49

标签: c# regex

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

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

示例数据:

ORD  1100
HOU 1 1215
MAD   4  1300

我试过了:

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

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

希望我改进了我的问题。

3 个答案:

答案 0 :(得分:2)

解决方案可能很简单:

\d{4}

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

答案 1 :(得分:1)

这里有一些小东西,使用 lookbehind lookahead 来确保只有4位数字,非数字(或开头/结尾)围绕它们

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

两个[^\d]可以替换为[\s],只匹配4位数字及其周围的空格。

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

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

该模式有三个部分。首先是 lookbehind (?<=PatternHere)。其中的模式必须在之前发生/匹配

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

最后一部分是 lookahead (?=PatternHere),它与 lookbehind 几乎相同,但检查另一方, forward < / em>的

答案 2 :(得分: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指的是比我们习惯的数字更多的数字(如东部阿拉伯数字)。