golang regexp取代单个数字

时间:2016-12-01 10:48:45

标签: regex go

我试图替换单个数字,但前提是它们没有单词字符。例如,

[*:*:1] a2b*d 3n 4q test 5 test 6

应改为

[*:*:*] a2b*d 3n 4q test * test *

在上面的列表中,数字1,5和6已被替换为*,但2,3和4未被替换,因为它们带有单词字符。

以下代码有效,但部分

https://play.golang.org/p/OC6bk4PLyq

s := "[*:*:1] a2b*d 3n 4q test 5 test 6"
re := regexp.MustCompile("[^0-9A-Za-z_][0-9]+[^0-9A-Za-z_]")
s = re.ReplaceAllString(s, "*")
fmt.Println(s) // Prints - [*:** a2b*d 3n 4q test*test 6

在此,我希望保留第一个单词中的:],并保留5周围的空格。此外,6未被替换。

有关如何在Go中实现这一目标的任何建议。

2 个答案:

答案 0 :(得分:2)

正则表达式\b\d+\b将解决您的问题。以下是转码。

package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`\b\d+\b`)
    var str = `[*:*:1] a2b56d 3n 4q test 5 test 877565656`
    var substitution = `*`

    fmt.Println(re.ReplaceAllString(str, substitution))
}

您可以在https://regex101.com/r/cyCS9C/2

测试此正则表达式

答案 1 :(得分:1)

使用以下正则表达式:

([^\w.]|^)[0-9]([^\w.]|\.(?:\D|$)|$)

并替换为$1*$2替换模式。

<强>详情:

  • ([^\w.]|^) - 第1组:不是点或字char(\w = [A-Za-z0-9_])或字符串开头(^
  • [0-9] - 1位
  • ([^\w.]|\.(?:\D|$)|$) - 第2组:除点或字char([^\w.])以外的字符,或.后跟字符串的非数字或结尾({{ 1}})或字符串结尾(\.(?:\D|$)

替换模式中的$将组1内容重新插入到结果中,$1对组2内容执行相同操作。

请参阅regex demoGo demo

$2

更新:要删除以1个字符分隔的1位整数,请使用循环检查匹配是否仍然存在,并替换为不匹配。将package main import ( "fmt" "regexp" ) func main() { s := "[*:*:1] a2b*d 3.5 5, 7. 3n 4q test 5 test 6" re := regexp.MustCompile(`([^\w.]|^)[0-9]([^\w.]|\.(?:\D|$)|$)`) s = re.ReplaceAllString(s, "$1*$2") fmt.Println(s) } 替换为:

s = re.ReplaceAllString(s, "$1*$2")

请参阅this Go demo