以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结尾的字符串中找到一个匹配项。如果我在一个模式中同时使用^$,则不会得到预期的结果。但如果我使用^$^baba$),那么我得到预期的结果,但如果myString5ba,那么它显示True,这不是我想要的。

以这种方式同时使用^$是否违法?

以Caret开头的单词和以Dollar结尾的单词不会产生预期的结果

^匹配字符串的开头,$匹配字符串的结尾。所以正则表达式^ba$分解如下:

  1. ^:字符串的开头
  2. b:文字字符"b"
  3. a:文字字符"a"
  4. $:字符串结束

因此,正则表达式将仅与精确字符串ba匹配。


如果我理解正确的话,您实际上想要做的是匹配任何以ba开头和结尾的字符串。所以我们需要使用通配符。

^ba.*ba$

.匹配"任意字符",*修改前一个表达式以匹配0次或更多次。所以这个正则表达式匹配如下:

  1. ^:字符串的开头
  2. ba:文字字符串"ba"
  3. .*:任何字符,0次或更多次。也就是说,任何字符的任何序列
  4. ba:文字字符串"ba"
  5. $:字符串结束

因此^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.StartsWithString.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$(使用内联单行选项)更快、更安全,但您也可以使用它。(请注意,点必须使用单行模式才能与换行符相匹配)。