【问题标题】:Regular Expression to match exact Sequence and Length正则表达式匹配精确的序列和长度
【发布时间】:2018-10-22 10:09:51
【问题描述】:

目标找到一个完全匹配的单词,该单词正好是 7 个字符,在一个句子中以 3 个字母开头,后跟 4 个数字。

有效输入: 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");
         }
      }
   }
}

输出

【问题讨论】:

  • 为什么需要正则表达式来处理这种简单的情况?
  • 您的代码到底有什么问题?这里还没有问题。

标签: c# regex


【解决方案1】:

在您的问题的实际状态下,您不能。除非您有一些限制可以让您将搜索限制在您需要查找的范围内。

ABCDE5134 将始终作为 3 个字母/4 位数字匹配(导致 BCDE5134),因为已扫描字符串并找到条件。

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

这将是正则表达式:

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

只要任何单词都用空格括起来,这应该可以工作。

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

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

因此,正则表达式的“波动容忍”版本将是:

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

【讨论】:

    【解决方案2】:

    不使用正则表达式的一种方法是将字符串拆分为“单词”,然后返回第一个以 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】:

      阅读您的代码,您似乎想拆分数据字符串。看来您正在使用 .NET。 通过将 string[] 数据的初始化替换为

      ,将您的字符串拆分为多个字符串

      string[] data = "This, is a test ,* P.....".Split(' ');

      这里有一个简单例子的解释: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】:

        如果我理解正确,你想要的是"[A-Za-z]{3}[0-9]{4}" 之前和之后的单词边界。如果字符串的开头或结尾有匹配项,或者在它之前或之后有标点符号(你不想以 . 结尾,因为它匹配像abc12345这样的字符串。

        试试这个:

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

        @ 使您不必逃避您在表达式中使用的每个\

        【讨论】: