我在C#编程语言中遇到正则表达式模式问题。我的regex模式似乎不像在Regexr上那样工作,即使对于不为空或不在列表中的值,我也能找到匹配项,其中我的regex用于特定的值列表和空字符串。以下是一段代码,可以演示问题的实质:
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
var pattern = "^(2|4|First|Fourth)?";
var regex = new Regex(pattern);
var empty = "";
var number = "3";
var yes = "yes";
var str = "str";
Console.WriteLine("empty " + regex.IsMatch(empty));
Console.WriteLine("number " + regex.IsMatch(number));
Console.WriteLine("yes " + regex.IsMatch(yes));
Console.WriteLine("string " + regex.IsMatch(str));
}
}
它不应该匹配str
和3
。也许您可以提出一些解决方案?
答案 0 :(得分:2)
模式(2|4|First|Fourth)
将与2
或4
或First
或Fourth
匹配,您是正确的,^
的字符串开头(所谓的定位符),但是您不知道的是?
运算符,这意味着**匹配零个或一个出现的模式, so, since it's applied to whole
(2 | 4 | First | Fourth)`模式,将匹配每个字符串。
您可以这样认为:匹配锚定在hte字符串开头的模式,但匹配零或一次,所以,也匹配字符串的开头。
在Demo中看到,每个字符串都匹配(匹配字符串的开头)。
只需删除?
运算符或将其替换为$
,即可匹配字符串的结尾(如果需要)。
要同时允许使用空字符串,请使用^(2|4|First|Fourth|)$
-它会使用$
固定字符串的末尾(如上所述),在您的替换中还添加了另一种可能性,即允许将空字符串匹配。
答案 1 :(得分:0)
如果要匹配空选项或多个选项(如您在comments中提到的那样),则可以采用以下方法:
"^(|2|4|First|Fourth)$"
它将与empty, "2", "4", "First" or "Fourth"
相匹配。
您提出的模式的问题是?
使整个组都是可选的,因此它将匹配任何:)。