以Caret开头的单词和以Dollar结尾的单词不会产生预期的结果
本文关键字:结果 结尾 开头 Caret 单词 Dollar 单词不 | 更新日期: 2023-09-27 18:21:25
我有以下代码。
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,这不是我想要的。
以这种方式同时使用^
和$
是否违法?
^
匹配字符串的开头,$
匹配字符串的结尾。所以正则表达式^ba$
分解如下:
^
:字符串的开头b
:文字字符"b"a
:文字字符"a"$
:字符串结束
因此,正则表达式将仅与精确字符串ba
匹配。
如果我理解正确的话,您实际上想要做的是匹配任何以ba
开头和结尾的字符串。所以我们需要使用通配符。
^ba.*ba$
.
匹配"任意字符",*
修改前一个表达式以匹配0次或更多次。所以这个正则表达式匹配如下:
^
:字符串的开头ba
:文字字符串"ba".*
:任何字符,0次或更多次。也就是说,任何字符的任何序列ba
:文字字符串"ba"$
:字符串结束
因此^ba.*ba$
将匹配以下任何字符串:
baba
bababa
bafoobarba
ba ba
但这些都不是:
ba
abba
bafoobar
我建议试用交互式regex测试仪。
我想在以ba开头、以ba 结尾的字符串中找到匹配项
我认为你的图案应该像
^ba.*ba$
字符串的^
启动
ba
字符ba
.*
任意字符0到n次
$
字符串的末尾
^ba$
匹配等于ba
的整个字符串,因为它只匹配字符串开头的b
,以及由于锚^
和$
而匹配字符串结尾的a
(此解释是正确的,因为您没有使用任何regex选项)。
您只需要检查字符串是否以子字符串开始和结束。然后,可以使用String.StartsWith
和String.EndsWith
方法。
string myString5 = "badabyba";
Console.WriteLine(myString5.StartsWith("ba") && myString5.EndsWith("ba"));
// => true
查看IDEONE演示
如果你真的需要一个正则表达式进行检查,你只需要
Regex.IsMatch(myString5, @"^ba") &&
Regex.IsMatch(myString5, @"ba$", RegexOptions.RightToLeft)
查看另一个regex演示
使用RegexOptions.RightToLeft
选项检查结束子字符串可以使其在输入文本很长的情况下比使用(?s)^ba.*ba$
(使用内联单行选项)更快、更安全,但您也可以使用它。(请注意,点必须使用单行模式才能与换行符相匹配)。