C# 正则表达式将字母数字值与特定条件匹配

C# 正则表达式将字母数字值与特定条件匹配,c#,regex,string,C#,Regex,String,我需要在以下条件下使用C#中的正则表达式匹配字符串: 整个字符串只能是字母数字(包括空格)。示例字符串应仅匹配:(数值可以更改) 示例1字符串:最佳5种产品 示例2字符串:5个最佳产品 示例3字符串:产品5最佳 我希望获得“5最佳”或“5最佳”,但以下字符串也匹配: 示例1字符串:最好的5种产品 示例2字符串:5个最佳产品 示例3字符串:产品5任何最好的 我正在使用: string utter11 = Console.ReadLine(); string pattern11 = "^(?=.*

我需要在以下条件下使用C#中的正则表达式匹配字符串:

整个字符串只能是字母数字(包括空格)。示例字符串应仅匹配:(数值可以更改)

示例1字符串:最佳5种产品

示例2字符串:5个最佳产品

示例3字符串:产品5最佳

我希望获得“5最佳”或“5最佳”,但以下字符串也匹配:

示例1字符串:最好的5种产品

示例2字符串:5个最佳产品

示例3字符串:产品5任何最好的

我正在使用:

string utter11 = Console.ReadLine();

string pattern11 = "^(?=.*best)(?=.*[0-9]).*$";

bool match = Regex.IsMatch(utter11, pattern11, RegexOptions.IgnoreCase);
Console.WriteLine(match);

欢迎提出任何建议。谢谢

试试
(?:(?你可以试试这个,我尽量靠近你的正则表达式:

^(?=.*(?:best [0-9]|[0-9] best)).*$

如果要获取捕获组,只需做一个小更改:

^(?=.*(best [0-9]|[0-9] best)).*$

它基本上是在寻找
best[0-9]
[0-9]best
,据我所知,这正是您要寻找的。

这个(完整示例)怎么样:

类程序
{
静态void Main(字符串[]参数)
{
List validStrings=新列表
{
“最佳5款产品”,
“五大最佳产品”,
“最佳产品5”,
“最佳5款产品”,
“5件最好的产品”,
“最佳产品5”,
};
列表无效字符串=新列表
{
“最佳5款产品。”,
“五大最佳产品”,
“最佳产品5”,
“最佳产品5/s”,
“5件最好的产品”,
“产品5任何东西都可以”,
};
字符串模式1=@“^([A-Za-z0-9\s]+\s+)[0-9]\s+([A-Za-z0-9\s]+\s+)?最佳(\s+[A-Za-z0-9\s]+)\s*);
字符串模式2=@“^([A-Za-z0-9\s]+\s+)\s*)最佳\s+([A-Za-z0-9\s]+\s+)[0-9](\s+[A-Za-z0-9\s]+)\s*);
string pattern=string.Format(“{0}{1}”,pattern1,pattern2);
foreach(有效字符串中的var str)
{
bool match=Regex.IsMatch(str,pattern);
控制台写入线(匹配);
}
Console.WriteLine();
foreach(无效字符串中的var str)
{
bool match=Regex.IsMatch(str,pattern);
控制台写入线(匹配);
}
Console.Read();
}
}

如果您有更多关于模式应匹配和不应匹配的字符串的示例,我将在必要时对表达式进行优化。

来自OP:“整个字符串只能是字母数字(包括空格)”。我认为您应该将
更改为字符类。@Vache我想知道OP为什么要使用
*
本身。另外,不应该匹配的字符串似乎不需要做任何关于字母数字的事情,包括空格,但实际上是关于
最佳
的位置和数字。否则,我想我们只需等待OP澄清…@Jerry:他试图在字符串模式中获得最佳或5,但你的正则表达式捕获整个字符串。如果我错了,请告诉我???@AnuragJain我的正则表达式没有捕获整个字符串。它匹配整个字符串。我建议的第二个正则表达式只捕获
最佳5
最佳5
…试试这个规则lar表达式:(最佳\s\d*)|(\d*\sbest)|(\d)
class Program
{
    static void Main(string[] args)
    {
        List<string> validStrings = new List<string>
        {
            "best 5 products",
            "5 best products",
            "products 5 best",
            "best anything 5 products",
            "5 anything best products",
            "products 5 anything best",
        };

        List<string> invalidStrings = new List<string>
        {
            "best 5 products.",
            "5 best product;s",
            "produc.ts 5 best",
            "best anything 5 product/s",
            "5 anything best produc-ts",
            "products 5 anything be_st",
        };

        string pattern1 = @"^(([A-Za-z0-9\s]+\s+)|\s*)[0-9]\s+([A-Za-z0-9\s]+\s+)?best((\s+[A-Za-z0-9\s]+)|\s*)$";
        string pattern2 = @"^(([A-Za-z0-9\s]+\s+)|\s*)best\s+([A-Za-z0-9\s]+\s+)?[0-9]((\s+[A-Za-z0-9\s]+)|\s*)$";
        string pattern = string.Format("{0}|{1}", pattern1, pattern2);

        foreach (var str in validStrings)
        {
            bool match = Regex.IsMatch(str, pattern);
            Console.WriteLine(match);
        }

        Console.WriteLine();

        foreach (var str in invalidStrings)
        {
            bool match = Regex.IsMatch(str, pattern);
            Console.WriteLine(match);
        }

        Console.Read();
    }
}