簡體   English   中英

正則表達式匹配字符串末尾的大寫字母

[英]Regex to match capital letters from the end of a string with a twist

給定一個字符串,例如“ fooBAR”,我希望將字符串末尾的大寫字母(即“ BAR”)匹配,但要注意以下幾點:

  1. 比賽必須至少包含兩個字母
  2. 匹配項不得包含以下任何內容:1D,2D,3D,4D

例子:

"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

示例: http//rubular.com/r/XgKv9pavJd

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM