正则表达式只有一个字符和7个数字

时间:2014-01-14 13:11:46

标签: c# regex

我希望正则表达式匹配任何单词和7个数字

中只有一个字符
match example:
1111111q
2222222q
111e1111
11e11111

我做这种模式但不适用于所有模式:

[A-Za-z][0-9]{7}

9 个答案:

答案 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)

正则表达式并不困难:

\d*[a-z]\d*匹配任意数量的数字,后跟一个字母,然后再匹配任意数量的数字。

(?=[a-z0-9]{8}positive lookahead assertion,这确保了总共8的长度。

重要的是使用anchorsword 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}$