2015-07-13 170 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