2015-11-10 54 views
1

我有以下代码。使用Caret开始单词并以Dollar结尾不会产生预期结果

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

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

+0

为什么你选择使用正则表达式呢? ['myString5.StartsWith(“ba”)&& myString5.EndsWith(“ba”)'](http://ideone.com/l6zpEo)就足够了。 –

回答

1

我想找到匹配在与BA开头的字符串,并与巴结束

我觉得你的模式应该像

^ba.*ba$ 

^开始字符串

ba人物ba

.*任何字符0到n倍

$字符串

+0

你能解释一下吗?它可以是“^ ba *。* ba $”。但是我认为ba应该是足够的,因为^ ba $满足它 – RotatingWheel

+0

@RotatingWheel'^ ba $'只匹配'ba',你需要一个匹配任何字符的匹配的'.'通配符 - 因为你想允许任何字符在' ba'和'ba' – fubo

2

^的端部相匹配的字符串的开头和$结束相匹配。因此正则表达式^ba$打破了这样的:

  1. ^:字符串的开始
  2. b:文字字符 'B'
  3. a:文字字符 'A'
  4. $:字符串
  5. 结束

因此,您的正则表达式仅适用于 matc h精确的字符串ba


如果我理解正确的话,你真正想要做的是比赛任何字符串,都开始与ba结束。所以我们需要使用通配符。

^ba.*ba$ 

.匹配“的任何字符”,和*修改前面的表达式来匹配0或更多的时间。所以这个正则表达式这样的匹配:

  1. ^:文本字符串 “BA”
  2. .*任意字符,0或更多的时间
  3. ba的开始。也就是说,任何字符的序列
  4. ba:文本字符串 “BA”
  5. $:字符串的结尾

所以^ba.*ba$将匹配这些字符串:

baba 
bababa 
bafoobarba 
ba  ba 

但不以下任何一种:

ba 
abba 
bafoobar 

我建议d试验interactive regex tester

+0

如果'ba'是一个有效的输入,他们*可能*正在寻找'^ ba(。* ba)* $' –

+0

@Damien_The_Unbeliever --OP似乎暗示他们不会想匹配'ba':“如果myString5是”ba“,那么它显示True” –

0

^ba$整个字符串,等于ba,因为它只能在字符串的开头匹配b,并a在字符串的结尾匹配由于锚^$(对此的解释是真实的,因为你不使用任何正则表达式选项)。

您只需检查字符串是否以子字符串开始和结束。然后,您可以使用String.StartsWithString.EndsWith方法。

string myString5 = "badabyba"; 
Console.WriteLine(myString5.StartsWith("ba") && myString5.EndsWith("ba")); 
// => true 

见​​

如果你真的需要检查一个正则表达式,你只需要

Regex.IsMatch(myString5, @"^ba") && 
Regex.IsMatch(myString5, @"ba$", RegexOptions.RightToLeft) 

见另一regex demo

检查与RegexOptions.RightToLeft选项结束串使得它更快,使用非常长的输入文本比使用(?s)^ba.*ba$(使用内联单行选项)更安全,bu你也可以使用它。 (请注意,单行模式对于一个点来匹配换行符是必需的)。