[英]Regex to match capital letters from the end of a string with a twist
給定一個字符串,例如“ fooBAR”,我希望將字符串末尾的大寫字母(即“ BAR”)匹配,但要注意以下幾點:
例子:
"fooB" -> ""
"fooBAR" -> "BAR"
"foo64BAR" -> "BAR"
"foo64BR" -> "BR"
"fooDBAR" -> "DBAR"
"foo12BAR" -> "BAR"
"foo1DBAR" -> "BAR"
瑣碎的正則表達式
[A-Z][A-Z]+
失敗最后一個示例(返回“ DBAR”而不是“ BAR”。)
負向后看,例如
(?<![1-4D])[A-Z][A-Z]+
也使最后一個示例失敗(返回“ AR”而不是“ BAR”。)
我覺得這應該很簡單,但是對於我的愛,我找不到解決方案。 有任何想法嗎?
我將遵循以下幾行代碼,結合一些簡單的模式:
string GetMatch(string input)
{
var match = Regex.Match(input, @"\d?([A-Z]{2,})$");
if (Regex.Match(match.Value, @"^[1-4]D").Success)
return match.Groups[1].Value.Substring(1);
else
return match.Groups[1].Value;
}
負向后看不起作用,因為在比賽之前它需要除1、2、3、4或D之外的其他值。 在您的示例中,“ B”適合該斷言,因此匹配就是此后的所有內容。
您需要查找沒有以1-4為前綴,后跟另一個大寫字母的D,或除D之后是另一個大寫字母的字母。
((?<![1-4])D|[ABCE-Z])[A-Z]+$
使用Regex選項Right To Left
從頭開始工作:
(?<![1-4])D?[A-Z-[D]]{2,}
以下應該工作:
(?!(?<=[1-4])D)[A-Z]{2,}$
這里的主要正則表達式是[AZ]{2,}
,它將匹配字符串末尾的兩個或多個大寫字符。 負前瞻(?!(?<=[1-4])D)
滿足您的其他要求。 這可以理解為“如果前一個字符是1到4之間的數字,而下一個字符是D,則失敗”。
如果要在行末而不是字符串末尾進行匹配,請使用RegexOptions.Multiline
。
FJ的正則表達式模式
(?!(?<=[1-4])D)[A-Z]{2,}$
對於所有可能的輸入均不正確,例如
fooBar1DDBAR
fooBar1DDB
進行一些更正應該可以解決問題:
(?<![A-Z])(?!(?<=[1-4])D)[A-Z]{2,}$
請參閱http://rubular.com/r/dGJWj7lE79(FJ )與http://rubular.com/r/mOux7d4zv3的區別
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.