2013-03-06 51 views
5

原單的問題表達去除定期有條件地格式化數字字符串


我找這將格式化包含特殊字符,字符和數字到只包含數字的字符串中的一個正則表達式。 有些特殊情況下,僅用「」(空)替換所有非數字字符是不夠的。

1)括號中爲零。

  • 如果括號(0)中只有零,如果它是第一個括號對,則應該將它們刪除。 (僅包含零的第二個支架對不應被移除)

2.)前導零。

  • 所有前導零應刪除(忽略括號)

爲了更好的理解舉例:

  • 123 (0) 123 would be 123123 (zero removed)
  • (0) 123 -123 would be 123123(zero and all other non-numeric characters removed)
  • 2(0) 123 (0) would be 21230 (first zero in brackets removed)
  • 20(0)123023(0) would be 2(first zero in brackets removed)
  • 00(0)1 would be 1(leading zeros removed)
  • 001(1)(0) would be 110 (leading zeros removed)
  • 0(0)02(0) would be 20 (leading zeros removed)
  • 123(1)3 would be 12313 (characters removed)
+0

正則表達式的語言/風格? – 2013-03-06 14:45:06

+0

@ExplosionPills C#.NET風格(見標籤)... – Virtlink 2013-03-06 14:51:14

+1

'[^ \ d]'是任何*不是數字的正則表達式,所以我不知道你打算如何使用這個正則表達式。 – 2013-03-06 14:54:47

回答

5

你可以使用一個lookbehind匹配(0)只有當它的之初字符串,並替換爲空字符串。

(去掉原溶液)


再次更新,以反映新的需求

匹配前導零,匹配(0)只有當它的第一個括號中的項目,和火柴任何非數字字符:

^[0\D]+|(?<=^[^(]*)\(0\)|\D 

請注意,大多數正則表達式引擎不支持變長lookbehinds(即使用量詞如*),所以這隻會在少數正則表達式引擎中工作 - .NET就是其中之一。

^[0\D]+  # zeroes and non-digits at start of string 
|   # or 
(?<=^[^(]*) # preceded by start of string and only non-"(" chars 
\(0\)  # "(0)" 
|   # or 
\D   # non-digit, equivalent to "[^\d]" 

regexhero.net測試)


你變了,現在又增加了需求的若干倍。對於這樣的多條規則,你可能更適合單獨編碼。如果一個條件匹配並且導致另一個條件不匹配時,它可能變得複雜和難以調試。例如,在單獨的步驟中:

  1. 根據需要刪除括號內的項目。
  2. 刪除非數字字符。
  3. 刪除前導零。

但是,如果你絕對需要這三個條件都匹配在一個單一的正則表達式(不推薦),在這裏。

+0

這是我的問題的正確答案,但我剛剛發現我的問題不夠精確 – Florian 2013-03-06 15:14:57

+0

@ Anubis1233再次更新以反映不斷變化的需求。 – Wiseguy 2013-03-06 15:56:35

+0

@ Anubis1233再次更新以反映您的更改和其他要求。此時,您可能應該單獨應用這些要求。 – Wiseguy 2013-03-06 18:45:54

1

此正則表達式應該是非常接近你正在尋找的人。

(^[^\d])|([^\d](0[^\d])?)+ 

(您可以替換由一個空字符串抓住一切)

編輯:

您的要求發展,現在是複雜的單程被treatd。假設你總是有一個支架組之前的空間,你可以使用這些通行證(保持這個順序):

string[] entries = new string[7] { 
    "800 (0) 123 - 1", 
    "800 (1) 123", 
    "(0)321 123", 
    "1 (0) 1", 
    "1 (12) (0) 1", 
    "1 (0) (0) 1", 
    "(9)156 (1) (0)" 
}; 
foreach (string entry in entries) 
{ 
    var output = Regex.Replace(entry , @"\(0\)\s*\(0\)", "0"); 
    output = Regex.Replace(output, @"\s\(0\)", ""); 
    output = Regex.Replace(output, @"[^\d]", ""); 
    System.Console.WriteLine("---"); 
    System.Console.WriteLine(entry); 
    System.Console.WriteLine(output); 
} 
+0

之後閱讀我的正則表達式,我發現它應該刪除它,但我沒有得到RegExr的任何問題,我的壞。無論如何,現在請求發展了,真正開始變得艱難! – zessx 2013-03-06 15:32:25

1

如果您可以使用多遍,則正則表達式會變得更簡單得多。我覺得你可以做第一遍放棄你(0),如果它不是一個字符串的第一件事,然後剝離出非數字跟隨它:

var noMidStrParenZero = Regex.Replace(text, "^([^(]+)\(0\)", "$1"); 
var finalStr = Regex.Replace(noMidStrParenZero, "[^0-9]", ""); 

避免了大量的正則表達式的瘋狂,和它也在一定程度上自我記錄。

編輯:這個版本也應該與你的新例子一起工作。

0
(?:  # start grouping 
    ^ # start of string 
    | # OR 
    ^\(# start of string followed by paren 
    | # OR 
    \d # a digit 
)  # end grouping 
(0+) # capture any number of zeros 
|  # OR 
([1-9]) # capture any non-zero digit 

This works for all of your example strings,而是整個表達式不匹配(接着是零。您可以使用Regex.Matches使用全局匹配來獲取匹配集合,然後將所有匹配的組加入字符串以僅獲取數字(或僅刪除任何非數字)。