代码之家  ›  专栏  ›  技术社区  ›  Clint

匹配精确序列和长度的正则表达式

  •  -1
  • Clint  · 技术社区  · 8 年前

    客观的 在一个句子中,从3个字母开始,后跟4个数字,为一个正好是7个字符的单词找到一个精确匹配项。

    有效输入: ABC1234、MOW0912、qbc1239

    我尝试使用

    var result = Regex.Match(myString, "[A-Za-z]{3}[0-9]{4}\\d{9}");
    

    我已经引用了几个类似的帖子,但没有帮助我解决这个问题

    C# Regular Expression Help Needed

    代码:到目前为止

    using System;
    using System.Text.RegularExpressions;
    
    public class Test
    {
       public static void Main()
       {
          string[] data = { "This, is a test ,* P.O ABC12 and ABCDE5134 this is some random words UserID ABC1234 that the users may have, regards, and the end of it" };
    
    
    
          foreach (string myString in data)
          {
             if (Regex.IsMatch(myString, "[A-Za-z]{3}[0-9]{4}"))
             {
                var result = Regex.Match(myString, "[A-Za-z]{3}[0-9]{4}");
                Console.WriteLine("{0} matches", myString);
                Console.WriteLine("result is" + result);
             }
             else
             {
                Console.WriteLine("does not match");
             }
          }
       }
    }
    

    输出

    enter image description here

    4 回复  |  直到 8 年前
        1
  •  2
  •   Liquid Core    8 年前

    在你的问题的实际状态下,你不能。除非你有一些限制,让你限制搜索,以准确地找到你需要的。

    ABCDE5134将始终以3个字母/4个数字的匹配方式进行匹配(结果是BCDE5134),因为已扫描字符串并找到条件。

    如果预期结果为ABC1234,则必须使用其周围的空格作为匹配条件(因此必须匹配“ABC1234”)。

    这将是正则表达式,然后:

    \s[A-Za-z]{3}[0-9]{4}\s

    只要任何单词都用空格括起来,这就行了。

    注意你需要的单词是否以点或标点符号结尾。

    在这种情况下,您也必须考虑这些因素(或删除最后的,或替换为。)

    因此,regex的“puctuation-tolerant”版本是:

    \s[A-Za-z]{3}[0-9]{4}

        2
  •  2
  •   Rufus L    8 年前

    不使用regex的一种方法是将字符串拆分为“单词”,然后返回第一个以3个字母开头、以4个数字结尾的单词:

    private static string GetCode(string input)
    {
        return input?.Split().FirstOrDefault(word => 
            word.Length == 7 &&
            word.Take(3).All(char.IsLetter) && 
            word.Skip(3).Take(4).All(char.IsNumber));
    }
    

    如果要在一个字符串中收集多个代码,可以修改以上内容以返回所有代码:

    private static List<string> GetCodes(string input)
    {
        return input?.Split().Where(word => 
            word.Length == 7 &&
            word.Take(3).All(char.IsLetter) && 
            word.Skip(3).Take(4).All(char.IsNumber))
            .ToList();
    }
    
        3
  •  2
  •   Minh Ngo    8 年前

    在阅读代码时,您似乎想拆分数据字符串。看来你正在和他一起工作。网 通过将字符串[]数据的初始化替换为

    string[]data=“这是一个测试,*P…..”。拆分(“”);

    下面是一个简单示例的说明: https://stackoverflow.com/a/7559140/9749761

    现在,有两种可能匹配字符串。您可以在if条件中添加如下内容:

    if(myString.Length==7&Regex.IsMatch(myString,“[A-Za-z]{3}[0-9]{4}”))

    资料来源: https://msdn.microsoft.com/en-us/library/system.string.length(v=vs.110).aspx

    或者可以像这样更改匹配模式两次: 如果要匹配整个字符串,请添加前导^和尾随$。 资料来源: https://stackoverflow.com/a/5066560/9749761

    我希望这对你有帮助。我有一年没有编写C#程序,但我知道正则表达式和C#的诀窍。 此外,它不会将AAA1111与附加或前缀的特殊字符相匹配。这可能是一个需要考虑的情况。

        4
  •  1
  •   Zachary    8 年前

    如果我理解正确,你想要的是 单词边界 前后 "[A-Za-z]{3}[0-9]{4}" .将其包装为空格字符( \s )如果字符串的开头或结尾有匹配项,或者前后有标点符号(您不希望以 . 要么是因为它匹配字符串 abc12345 )。

    尝试以下操作:

    @"\b[A-Za-z]{3}[0-9]{4}\b"

    (The @ 让你不用逃避 \ 您在表达式中使用)