2016-07-28 72 views
1

這是用C#編寫的。我一直在竊聽我的頭,但目前還沒有運氣。正則表達式,用於刪除字符串中沒有其他字母的前兩個字母

因此,例如

123456BVC --> 123456BVC (keep the same) 
123456BV --> 123456 (remove trailing letters) 
12345V -- > 12345V (keep the same) 
12345 --> 12345 (keep the same) 
ABC123AB --> ABC123 (remove trailing letters) 

它可以和任何啓動。

我已經試過@".*[a-zA-Z]{2}$",但沒有運氣

這是在C#,使我總是返回一個字符串,刪除這兩個字母結尾,如果它們確實存在,而不是前面有另一封信。

Match result = Regex.Match(mystring, pattern); 
return result.Value; 
+0

「AB」應該輸出什麼? – dotctor

+0

@dotctor:這似乎不相關,因爲在運行正則表達式之前,可以用'mystring.Length'來檢查字符串長度。 –

回答

0

@".*[a-zA-Z]{2}$"正則表達式比一個換行符(儘可能多的)以外的任何字符0+和2個ASCII字母在字符串的結尾相匹配。你不檢查上下文,所以這兩個字母是匹配的,不管前面有什麼。

你需要一個正則表達式將匹配前面不帶字母的最後兩個字母:

(?<!\p{L})\p{L}{2}$ 

this regex demo

詳細

  • (?<!\p{L}) - 如果一個字母(\p{L})是當前位置之前找到(你可以使用[a-zA-Z]如果只想處理ASCII字母)
  • \p{L}{2}失敗的比賽 - 2個字母
  • $ - 字符串結尾。

在C#中,使用

var result = Regex.Replace(mystring, @"(?<!\p{L})\p{L}{2}$", string.Empty); 
+1

表達式的細分將是很好的,而不是僅僅提供一個勺子餵養的答案,這個問題如此具體,它不可能對任何人有任何用處 –

+1

不知道你的意思是勺子餵養的答案,OP提供了一個使用的正則表達式OP。我在100%的答案中加入瞭解釋,在配置文件中查看我的答案。 –

+1

@WiktorStribiżew謝謝!作爲一種魅力。測試用例: 「132456AC」,ExpectedResult = 「132456」) 「132456ACV」,ExpectedResult = 「132456ACV」) 「ABC2D2DD」,ExpectedResult = 「ABC2D2」) 「123456」,ExpectedResult = 「123456」) 「1234AB」 ,ExpectedResult =「1234」) 「1234A」,ExpectedResult =「1234A」) – exevio

0

如果你正在尋找刪除這些最後兩個字母,您可以簡單地這樣做:

string result = Regex.Replace(originalString, @"[A-Za-z]{2}$", string.Empty); 

請記住,在正則表達式$意味着結束輸入的字符串或換行符之前的字符串。

+0

再一次,這個'[A-Za-z] {2} $'沒有解釋最後兩個字母前的內容。至於*或換行符之前的字符串* - 由於您沒有使用'RegexOptions.Multiline'標誌,因此不在您的情況。 –

+0

根據我的理解,它不需要基於這個問題。 @exevio只是希望字符串中的最後兩個字符被刪除。沒有必要處理不匹配的內容,因爲我們沒有取代任何內容,除非我完全誤讀了某些內容,否則它不會改變最後2個字母是否是字母。 –

+0

請參閱* 123456BVC - > 123456BVC(保持不變)*。 [你的正則表達式](https://regex101.com/r/cZ8yK2/1)不保留相同*。 –

相關問題