我试图替换单个数字,但前提是它们没有单词字符。例如,
[*:*: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中实现这一目标的任何建议。
答案 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))
}
测试此正则表达式
答案 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 demo和Go 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。