2015-07-13 82 views
3

我想用零替換一個字符串中的所有數字,理想情況下連續數字應該用一個零替換。
abc826def47應該成爲abc0def0在golang中用零替換數字

我已經嘗試了兩種方法:
使用正則表達式:使用strings.Replace

import s "strings" 
func normalizeNumbers(str string) string{ 
    str = s.Replace(str, "1", "0", -1) 
    str = s.Replace(str, "2", "0", -1) 
    str = s.Replace(str, "3", "0", -1) 
    str = s.Replace(str, "4", "0", -1) 
    str = s.Replace(str, "5", "0", -1) 
    str = s.Replace(str, "6", "0", -1) 
    str = s.Replace(str, "7", "0", -1) 
    str = s.Replace(str, "8", "0", -1) 
    str = s.Replace(str, "9", "0", -1) 
    str = s.Replace(str, "00", "0", -1) 
    return str 
} 

第二種方法

var numbersRegExp = regexp.MustCompile("[0-9]+") 
func normalizeNumbers(str string) string{ 
    return numbersRegExp.ReplaceAllString(str, "0") 
} 

不使用正則表達式似乎要快一點,但還是很sl當處理大約100k字符串時,它並不能很好地取代連續的數字。
有沒有更好的方法來做到這一點?

回答

6

最快的解決方案是(總是)即時生成輸出。這需要循環輸入一次符文,並使用適當的初始輸出「緩衝區」(在這種情況下爲[]rune),也可以避免重新分配。

下面是執行:

func repNums(s string) string { 
    out := make([]rune, len(s)) // len(s) is bytes not runes, this is just estimation 

    i, added := 0, false 
    for _, r := range s { 
     if r >= '0' && r <= '9' { 
      if added { 
       continue 
      } 
      added, out[i] = true, '0' 
     } else { 
      added, out[i] = false, r 
     } 
     i++ 
    } 
    return string(out[:i]) 
} 

測試它:

fmt.Printf("%q\n", repNums("abc826def47")) // "abc0def0" 
fmt.Printf("%q\n", repNums("1234"))  // "0" 
fmt.Printf("%q\n", repNums("asdf"))  // "asdf" 
fmt.Printf("%q\n", repNums(""))   // "" 
fmt.Printf("%q\n", repNums("a12b34c9d")) // "a0b0c0d" 

嘗試它的Go Playground

注:

  • 我與len(s)估計的輸出緩衝器(符的數目),這是不輸入,但是字節計數符計數。這是高估,但不需要付出努力。如果你願意的話,你可以用utf8.RuneCountInString()來得到輸入string符文的確切數量(但是這代碼並循環輸入string的符文,並不真正值得)。
  • 我使用條件r >= '0' && r <= '9'測試數字。或者,您可以使用unicode.IsDigit()
  • 根據輸入字符串的性質,如果沒有數字的輸入頻率很高(因此輸出等於輸入),您可以通過首先測試來提高性能,如果有數字在輸入,如果沒有,只需返回輸入string(這是不可變的)。
+0

謝謝,使用這種方法,性能提高了約50%。我會等待看看是否有其他答案。 – paradite

+0

我如何檢測輸入中是否有數字而沒有遍歷整個字符串? – paradite

+1

@paradite你不能,所以它有點開銷。但是如果你這樣做並且發現沒有數字被包含,你可以立即返回輸入字符串而不做任何其他的事情。 – icza