我有以下代码。
string pattern5 = "^ba$";
string myString5 = "badabyba";
bool match5 = Regex.IsMatch(myString5, pattern5);
Console.WriteLine(match5); // should print True but I see False
我想在以ba
开头并以ba
结尾的字符串中找到匹配项。如果我在单个模式中同时使用^
和$
,则不会给出预期结果。但是,如果我使用^
或$
(^ba
或ba$
),那么我会得到预期结果,但如果myString5
是ba
,那么显示True,这不是我想要的。
以这种方式一起使用^
和$
是否合法?
答案 0 :(得分:2)
printDescription
匹配字符串的开头,^
匹配结尾。所以正则表达式$
就像这样分解:
^ba$
:字符串的开头^
:字面字符'b'b
:字面字符'a'a
:字符串结尾因此,您的正则表达式仅匹配精确的字符串$
。
如果我理解正确,您实际想要做的就是匹配任何字符串,它以ba
开头和结尾。所以我们需要使用通配符。
ba
^ba.*ba$
匹配“任何字符”,.
修改前一个表达式以匹配0或更多次。所以这个正则表达式匹配如下:
*
:字符串的开头^
:文字字符串“ba”ba
:任意字符,0次或更多次。也就是说,任何字符的任何序列.*
:文字字符串“ba”ba
:字符串结尾因此$
将匹配以下任何字符串:
^ba.*ba$
但不是这些中的任何一个:
baba
bababa
bafoobarba
ba ba
我建议您尝试使用interactive regex tester。
答案 1 :(得分:1)
我想在以ba开头并以ba结尾的字符串中找到匹配
我认为你的模式看起来像
^ba.*ba$
^
字符串的开头
ba
字符ba
.*
0到n次的任何字符
$
字符串的结尾
答案 2 :(得分:0)
^ba$
匹配整个字符串,该字符串等于ba
,因为它只匹配字符串开头的b
,并且字符串末尾的a
匹配锚点^
和$
(由于您没有使用任何正则表达式选项,因此这种解释是正确的。)
您需要检查字符串是否以子字符串开头和结尾。然后,您可以使用String.StartsWith
和String.EndsWith
方法。
string myString5 = "badabyba";
Console.WriteLine(myString5.StartsWith("ba") && myString5.EndsWith("ba"));
// => true
请参阅IDEONE demo
如果你真的需要正则表达式进行检查,你只需要
Regex.IsMatch(myString5, @"^ba") &&
Regex.IsMatch(myString5, @"ba$", RegexOptions.RightToLeft)
查看另一个regex demo
使用RegexOptions.RightToLeft
选项检查结束子字符串,使用非常长的输入文本比使用(?s)^ba.*ba$
(使用内联单行选项)更快更安全,但您也可以使用它。 (请注意,单线模式是点匹配换行符号所必需的。)