用Caret开始一个单词并以Dollar结尾不会产生预期的结果

时间:2015-11-10 14:11:55

标签: c# regex

我有以下代码。

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,这不是我想要的。

以这种方式一起使用^$是否合法?

3 个答案:

答案 0 :(得分:2)

printDescription匹配字符串的开头,^匹配结尾。所以正则表达式$就像这样分解:

  1. ^ba$:字符串的开头
  2. ^:字面字符'b'
  3. b:字面字符'a'
  4. a:字符串结尾
  5. 因此,您的正则表达式匹配精确的字符串$

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

    ba

    ^ba.*ba$ 匹配“任何字符”,.修改前一个表达式以匹配0或更多次。所以这个正则表达式匹配如下:

    1. *:字符串的开头
    2. ^:文字字符串“ba”
    3. ba任意字符,0次或更多次。也就是说,任何字符的任何序列
    4. .*:文字字符串“ba”
    5. ba:字符串结尾
    6. 因此$将匹配以下任何字符串:

      ^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.StartsWithString.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$(使用内联单行选项)更快更安全,但您也可以使用它。 (请注意,单线模式是点匹配换行符号所必需的。)