2013-04-23 155 views
0

我想寫一個正則表達式,但它太貪婪了。輸入字符串的形式可以是以下格式:正則表達式太貪婪

STUFF_12_1234 or STUFF_1234 

我想要做的是創建一個正則表達式的最後_後搶字符。所以在上面的例子中,將會是數字「1234」。這個最後的_之後的字符數量會有所不同,它們可能是字母和數字的組合。我曾嘗試下面的表達式:

_(.*?)\Z 

這可以通過返回「1234」工程「STUFF_1234」但是當我用它對付「STUFF_12_1234」返回「12_1234」

任何建議的表達應該如何改變以解決這個問題?

+2

您可以通過'_'分割字符串,並選擇最後一個項目。 – nhahtdh 2013-04-23 11:30:20

回答

1

至少有3種方式來搶佔近下劃線_後出現的文字:

  • 保留當前正則表達式,但是指定RightToLeftRegexOptions。由於正則表達式是從右到左搜索的,所以惰性量詞將盡可能少地匹配字符串中最後一個_之後的字符。通過_

    _([^_]*)\Z 
    
  • 拆分輸入字符串,並選擇最後一項:

  • 修改正則表達式來禁止下劃線_在要匹配的文本。對於此String.Split已足夠,不需要Regex.Split

+0

一些很好的答案,但這是最全面的,給出三種不同的選擇。我幾乎得到正確的表達,但決定張貼在這裏,去吃午飯。感謝所有的投入。 – Retrocoder 2013-04-23 12:59:48

0

從有效字符列表中排除_

_([^_]*)\Z 
0

無論早期還是晚期停止使用正則表達式

_([^_]*)\Z 

按正規表達式搜索左到右,讓貪婪控制。但它不會改變比賽左端的位置。

0

兩個選項。

  1. 用正則表達式:

    _([^_]*?) 
    

    你只需要沒有選擇_字符或

    _(\d*?) 
    

    如果你知道的字符是數字(\d

  2. 隨着子串:

    yourString.Substring(yourString.LastIndexOf('_')+1) 
    
0

試試這個:

String s_YourString="STUFF_12_34"; 
String s_OP = Regex.Match(s_YourString, "_[^_.]+$").Value.Trim('_');//Output:34    
s_YourString="STUFF_1234"; 
s_OP = Regex.Match(s_YourString, "_[^_.]+$").Value.Trim('_'); //Output:1234