我希望正则表达式匹配任何单词和7个数字
中只有一个字符match example:
1111111q
2222222q
111e1111
11e11111
我做这种模式但不适用于所有模式:
[A-Za-z][0-9]{7}
答案 0 :(得分:7)
正则表达式匹配模式。在你的情况下,看起来字母可以在你的字符串中的任何一点,这意味着你将有许多需要考虑的模式。
我认为对于这种情况,为简单起见,不应该使用正则表达式。我建议您查看Char.isDigit(Char c)
和Char.isLetter(Char c)
方法,并使用计数器查看字符串是否符合您的格式。
答案 1 :(得分:4)
C#中有很多可用的方法来检查你想要的条件。如果没有解析器或简单的c#解决方案,我会使用正则表达式。
我想在下面
var str = "1111111u";
var isValid = str.Length ==8 &&
str.Where(char.IsDigit).Count() ==7 &&
str.Where(char.IsLetter).Count() ==1;
答案 2 :(得分:2)
正则表达式并不困难:
如果完整字符串必须匹配,请使用:
^(?=.{8}$)\d*[a-zA-Z]\d*$
如果这是较大文字中的单词,请使用:
\b(?=[a-z0-9]{8}\b)\d*[a-z]\d*\b
\d*[a-z]\d*
匹配任意数量的数字,后跟一个字母,然后再匹配任意数量的数字。
(?=[a-z0-9]{8}
是positive lookahead assertion,这确保了总共8的长度。
重要的是使用anchors或word boundaries来避免部分错误匹配。
如果您确实要匹配任何字母,请使用Unicode property \p{L}
代替字符类:
^(?=.{8}$)\d*\p{L}\d*$
答案 3 :(得分:0)
如果你想要一个字母和7位
,请使用它 "[A-Za-z]{1}[0-9]{7}|[0-9]{7}[A-Za-z]{1}|[0-9]{1}[A-Za-z]{1}[0-9]{6}[0-9]{1}|[0-9]{2}[A-Za-z]{1}[0-9]{5}|[0-9]{3}[A-Za-z]{1}[0-9]{4}|[0-9]{4}[A-Za-z]{1}[0-9]{3}|[0-9]{5}[A-Za-z]{1}[0-9]{2}"
这里有一段代码片段,您可以如何遍历结果
string st = "1111111q 2222222q 111e1111 11e11111";
string pattS = @"[A-Za-z]{1}[0-9]{7}|[0-9]{7}[A-Za-z]{1}|[0-9]{1}[A-Za-z]{1}[0-9]{6}[0-9]{1}|[0-9]{2}[A-Za-z]{1}[0-9]{5}|[0-9]{3}[A-Za-z]{1}[0-9]{4}|[0-9]{4}[A-Za-z]{1}[0-9]{3}|[0-9]{5}[A-Za-z]{1}[0-9]{2}";
Regex regex = new Regex(pattS);
var res = regex.Matches(st);
foreach (var re in res)
{
}
在rubular上检查here,它涵盖了您提供的所有示例
答案 4 :(得分:0)
这将符合您的要求:
(\d{1}\w\d{6}|\d{2}\w\d{5}|\d{3}\w\d{4}|\d{4}\w\d{3}|\d{5}\w\d{2}|\d{6}\w\d{1}|\d{7}\w)
我在powershell中生成了这个:
$n = 6;
for ($i = 1; $i -le 6; $i++) {
write-host "\d{"$i"}\w\d{"$n"}"
$n--
}
答案 5 :(得分:0)
您的示例仅在字符是字符串中的第一个字符时才有效。
您遇到的问题是您需要总共7个数字,并且绝对只有一个字符可能在这7个数字内。这不是理论中定义的正则表达式所能实现的,因为您必须在两组数字之间建立链接,以查看另一组中有多少数字,并且正则表达式不能携带它们的那种上下文。
我想知道是否可以使用前瞻断言来确保只有一个字母,但我能做的最好的事情就是确保连续两个字母没有实例,这并不包括所有可能的无效情况。因此,我认为你将不得不寻找另一种方法,正如npinti建议的那样。如下所示:
public static bool Match(string s) {
return (s.Length == 8) &&
(s.Where(Char.IsDigit).Count() == 7) &&
(s.Where(Char.IsLetter).Count() == 1);
}
但我没有测试过。
答案 6 :(得分:0)
使用Regex,您可以分两步完成。首先,你可以删除角色,无论它在什么位置:
string input = "111a1111";
Regex rgx = new Regex(@"[a-zA-Z]");
string output=rgx.Replace(input,"",1); // remove only one character
// output = "1111111"
然后您可以与[0-9]{7}
匹配(如果您不希望所有数字都相同)
或者使用^(\d)\1{6}$
(如果你想要7次出现相同的数字)
答案 7 :(得分:0)
我只能想出一个“强力”正则表达式方法:
foundMatch = Regex.IsMatch(subjectString,
@"\b
(?:[a-z]\d{7}|
\d[a-z]\d{6}|
\d{2}[a-z]\d{5}|
\d{3}[a-z]\d{4}|
\d{4}[a-z]\d{3}|
\d{5}[a-z]\d{2}|
\d{6}[a-z]\d{1}|
\d{7}[a-z])
\b",
RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
请注意单词边界锚点,如果此模式是较长字符串的一部分,则应将其删除。
另请注意IgnoreCase选项,如果所有字母都是小写,则可以删除。
修改:请参阅@stema答案 - 更简洁的正则表达式
答案 8 :(得分:0)
您可以使用此模式:
^([0-9])(?:\1|[a-z](?!.*[a-z])){7}|[a-z]([0-9])\2{6}$