我正在尝试为以下内容构建正则表达式:
我该怎么做?
答案 0 :(得分:5)
以下是我如何编写它(在自由间隔模式下使用C#):
if (Regex.IsMatch(text, @"
# Match specific string with multiple requirements.
^ # Anchor to start of string.
(?=.{6}$) # 6 characters exactly.
(?: # There are exactly
[A-Z]{3,5} # 3, 4, 5 or
| [A-Z] # 1, uppercase letters
) # at the beginning,
[0-9]+ # the rest must be numbers.
$ # Anchor to end of string.",
RegexOptions.IgnorePatternWhitespace)) {
// Successful match
} else {
// Match attempt failed
}
编辑:从PHP更改为C#/。NET语法。
答案 1 :(得分:2)
我更喜欢使用正则表达式来获得更多的humaa可读性
var input = "ABC456";
return input.Length==6 && Regex.IsMatch(input,@"^([A-Z]|[A-Z]{3,5})\d+$");
答案 2 :(得分:2)
退位
定义重构:
- 总共6个字符,大写字母和数字字符
- 首先必须是一个字母,最后一个数字
- 首字母可选地后跟2到4个字母
方法1 :
^(?=.{6}$)[A-Z](?:[A-Z]{2,4})?\d+$
(扩展)
^
(?= .{6} $ )
[A-Z] (?:[A-Z]{2,4})? \d+ $
方法2 :
^(?=[A-Z](?:(?<!\d)[A-Z]|\d){4}\d$)[A-Z](?:[A-Z]{2,4})?\d
(扩展)
^
(?= [A-Z] (?: (?<!\d)[A-Z] | \d ){4} \d $ )
[A-Z] (?:[A-Z]{2,4})? \d
方法2不需要结束锚,因为断言是长度和结束特定的,但是由于后视(由于OP的条件)而使得看起来缓慢/麻烦。
出于这个原因,我会使用方法1正则表达式,虽然我相信另一个会得到更好的速度工作台,这可能是在这种情况下代码清晰度的无关紧要。
答案 3 :(得分:1)
^[A-Z](([A-Z]{2}[0-9]{3})|([A-Z]{3}[0-9]{2})|([A-Z]{4}[0-9]{1})|([0-9]{5}))$
更新:现在符合所有要求
答案 4 :(得分:1)
^([A-Z]\d{5})|([A-Z]{3}\d{3})|([A-Z]{4}\d{2})|([A-Z]{5}\d)$
答案 5 :(得分:0)
这应该是我的头脑。可能会有更短的更优雅的版本..
bool foundMatch = false;
try {
foundMatch = Regex.IsMatch(subjectString, @"\A(?:(?:[A-Z]\d{5})|(?:[A-Z]{3}\d{3})|(?:[A-Z]{4}\d{2})|(?:[A-Z]{5}\d))\Z");
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}