2012-01-05 65 views
7

尋找一個正則表達式的字符串,這將讓我找到了最右邊的(如果有的話)組數字嵌入的字符串。我們只關心連續的數字。我們不關心符號,逗號,小數等。如果找到,應該簡單地像字母一樣視爲非數字。什麼RegEx字符串會查找字符串中最後(最右邊)的一組數字?

這是更換/遞增的目的,所以我們還需要抓住一切之前和檢測的數量後,這樣我們就可以增加值後重建的字符串,所以我們需要一個切分正則表達式。

這裏的例子,我們正在尋找什麼:

  • 「abc123def456ghi」 應確定the'456'
  • 「abc123def456ghi789jkl」 應確定the'789'
  • 「abc123def」 應確定」 123'
  • 「123ghi」 應確定the'123'
  • 「abc123,456ghi」 應確定the'456'
  • 「ABC-654def」 應當IDE ntify the'654'
  • ‘ABCDEF’不應返回任何比賽

由於我們想要的一個例子,它會是這樣的名稱開始‘項目4-1A’,提取出'1'作爲前綴後的所有內容,後綴爲後綴。然後使用它,我們可以在代碼循環中生成值'Item 4-2a','Item 4-3a'和'Item 4-4a'。現在

如果我要找的第一組,這將是很容易。我只是找到0個或多個非數字字符爲前綴的第一個連續的塊,然後將1個或更多數量的連續數字塊,然後一切到底是後綴。

我遇到的問題是如何定義的前綴爲包括除了最後一組的所有(如果有的話)的數字。我嘗試使用前綴的所有內容都會吞噬最後一組,即使我試圖通過基本顛倒上述方法來將它錨定到最後。

+0

由@Birei提供,並在連接之前更新第二個索引以獲得所需的結果。 – 2012-01-05 13:15:43

+0

你怎麼能分裂?如果字符串是a44b44c呢?前綴應該是'a44b',如果我打算進行過多的手動操作,那麼使用正則表達式已經支持已命名的令牌。 – MarqueIV 2012-01-05 13:18:11

+1

通過拆分,我的意思是(Regex.Split)[http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.split.aspx],因此是以前評論中的超鏈接。應用'Regex.Split()'爲'a44b44c'賦予3個標記。 'a44b','44'和'c'。 – 2012-01-05 13:21:51

回答

13

如何:

^(.*?)(\d+)(\D*)$ 

然後增加第二組和CONCAT全部3。

說明:

^   : Begining of string 
    (  : start of 1st capture group 
    .*? : any number of any char not greedy 
)  : end group 
    (  : start of 2nd capture group 
    \d+ : one or more digits 
)  : end group 
    (  : start of 3rd capture group 
    \D* : any number of non digit char 
)  : end group 
$   : end of string 

第一個捕獲組將匹配所有字符,直到數字最後一組的字符串結束前的第一位。

,或者如果可以使用指定的組

^(?<prefix>.*?)(?<number>\d+)(?<suffix>\D*)$ 
+0

根據最後一組數字的位置,這可能比我的效率更高。 +1 – ridgerunner 2012-01-05 13:43:26

+0

好的,這個很好用......但我看不到!你能編輯這個來顯示每個人在做什麼的評論嗎?例如,即使在你的第一組中,我也很難被...(。*?)......因爲我認爲問號和星號在一段時間後是相互排斥的,但顯然我錯了。 – MarqueIV 2012-01-05 14:05:32

+0

@MarqueIV:不客氣。 – Toto 2012-01-05 14:26:24

5

嘗試下一個正則表達式:

(\d+)(?!.*\d) 

說明:

(\d+)   # One or more digits. 
(?!.*\d)  # (zero-width) Negative look-ahead: Don't find any characters followed with a digit. 

EDIT(問題的OFFTOPIC)::這個答案是不正確,但這個問題已經在被回答其他職位,以避免在Perl刪除這一項,我將使用相同的正則表達式的其他方式,例如可以使用這樣得到同樣的重SULT在C#(增量最後一位數字):

s/(\d+)(?!.*\d)/$1 + 1/e; 
+0

不完全。這確實可以確定數字,但它仍然不會顯示如何標記字符串以獲取前綴和後綴,這正是我所苦苦掙扎的。你能幫忙嗎? – MarqueIV 2012-01-05 13:08:12

+0

@MarqueIV:你是對的,不是你想要的,我錯過了這一點,對不起。但現在有一些正確的答案可以很好地解決你的問題。 – Birei 2012-01-05 14:20:47

3

您也可以嘗試點點簡單的版本:

(\d+)[^\d]*$ 
+1

那些其他人不會爲我工作......這的確如此。簡單是一種藥物。 – 2012-01-08 01:44:54

+0

下面是一個測試,證實這可以按預期工作:http://regex101.com/r/hN8zG5/1 – 2014-09-17 20:44:01

1

這應做到:

Regex regexObj = new Regex(@" 
    # Grab last set of digits, prefix and suffix. 
    ^    # Anchor to start of string. 
    (.*)   # $1: Stuff before last set of digits. 
    (?<!\d)   # Anchor start of last set of digits. 
    (\d+)   # $2: Last set of one or more digits. 
    (\D*)   # $3: Zero or more trailing non digits. 
    $    # Anchor to end of string. 
    ", RegexOptions.IgnorePatternWhitespace); 
1

什麼不使用正則表達式。您可以通過以下[裂開]使用正則表達式(http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.split.aspx)的代碼片段(控制檯)

string[] myStringArray = new string[] { "abc123def456ghi", "abc123def456ghi789jkl", "abc123def", "123ghi", "abcdef","abc-654def" }; 

     char[] numberSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 
     char[] filterSet = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m', 
             'n','o','p','q','r','s','t','u','v','w','x','y','z','-'}; 
     foreach (string myString in myStringArray) 
     { 
      Console.WriteLine("your string - {0}",myString); 
      int index1 = myString.LastIndexOfAny(numberSet); 
      if (index1 == -1) 
      Console.WriteLine("no number"); 
      else 
      { 
       string mySubString = myString.Substring(0,index1 + 1); 
       string prefix = myString.Substring(index1 + 1); 
       Console.WriteLine("prefix - {0}", prefix); 
       int index2 = mySubString.LastIndexOfAny(filterSet); 
       string suffix = myString.Substring(0, index2 + 1); 
       Console.WriteLine("suffix - {0}",suffix); 
       mySubString = mySubString.Substring(index2 + 1); 
       Console.WriteLine("number - {0}",mySubString); 
       Console.WriteLine("_________________"); 
      } 
     } 
     Console.Read(); 
相關問題