如果字符串长度为2且包含1个字母和1个数字,则正则表达式匹配

时间:2012-01-06 17:15:11

标签: c# regex

伙计们,我讨厌正则表达式而且我在写作时很糟糕。

我有一个空格分隔的字符串,包含几个我需要提取的代码。每个代码都以大写字母开头并以数字结尾。代码只有两位数。

我正在尝试从初始字符串创建一个字符串数组,但我无法正确获得正则表达式。

这就是我所拥有的

String[] test = Regex.Split(originalText, "([a-zA-Z0-9]{2})");

我也尝试过:

String[] test = Regex.Split(originalText, "([A-Z]{1}[0-9]{1})");

我没有任何Regex经验,因为我尽量避免写它们。

有人有任何建议吗?

示例输入:

AA2410 F7 A4 Y7 B7 A 0715 0836 E0.M80

我需要拿出F7,A4,B7。 E0应该被忽略。

3 个答案:

答案 0 :(得分:3)

你想收集结果,而不是分开它们,对吗?

Regex regexObj = new Regex(@"\b[A-Z][0-9]\b");
allMatchResults = regexObj.Matches(subjectString);

应该这样做。 \b是单词边界,确保只提取整个字符串(如A1),而不是子字符串(如A1中的TWA101)。

如果您还需要在其中排除包含非字字符的“字词”(例如评论中的E0.M80),则需要定义自己的字边界,例如:

Regex regexObj = new Regex(@"(?<=^|\s)[A-Z][0-9](?=\s|$)");

现在A1仅在被空格(或字符串开头/结束位置)包围时匹配。

<强>解释

(?<=  # Assert that we can match the following before the current position:
 ^    # Start of string
|     # or
 \s   # whitespace.
) 
[A-Z] # Match an uppercase ASCII letter
[0-9] # Match an ASCII digit
(?=   # Assert that we can match the following after the current position:
 \s   # Whitespace
|     # or
 $    # end of string.
)

如果您还需要查找非ASCII字母/数字,可以使用

\p{Lu}\p{N}

而不是[A-Z][0-9]。这会找到所有大写的Unicode字母和Unicode数字(如Ä٣),但我想这不是你真正想要的,是吗?

答案 1 :(得分:2)

您的意思是每个代码看起来像“A00”吗?

然后这是正则表达式:

"[A-Z][0-9][0-9]"

非常简单......顺便说一下,在正则表达式中写{1}是没有意义的。 [0-9]{1}表示“只匹配一位数,这与写[0-9]完全相同。

不要放弃,简单的正则表达非常有意义。

答案 2 :(得分:0)

这应该没问题:

String[] all_codes = Regex.Split(originalText, @"\b[A-Z]\d\b");

它为您提供一个数组,其中所有代码都以大写字母开头,后跟一个数字,以一种单词边界(网站空间等)分隔。