2015-11-10 53 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你也可以使用它。 (請注意,單行模式對於一個點來匹配換行符是必需的)。