英文:
golang regexp replace single digits
问题
我正在尝试替换单个数字,但仅当它们不与字母字符一起出现时才替换。例如:
[*:*: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) // 输出 - [*:** a2b*d 3n 4q test*test 6
在这里,我希望第一个单词中的:和]保留下来,并保留5周围的空格。另外,6没有被替换。
有关如何在Go中实现这一点的建议吗?
英文:
I'm trying to replace single digits, only if they are not accompanied by a word character. For e.g.
[*:*:1] a2b*d 3n 4q test 5 test 6
Should be change into
[*:*:*] a2b*d 3n 4q test * test *
In the above list, the numbers 1, 5 and 6 have been replaced with *, but 2, 3 and 4 are not replaced as they are accompanied by a word character.
The below code works, but partially
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
Here, I would like the : and the ] in the first word to be retained and the spaces around 5 to be retained. Also the 6 is not replaced.
Any suggestions on how this can be achieved in Go.
答案1
得分: 2
使用以下正则表达式:
([^\w.]|^)[0-9]([^\w.]|\.(?:\D|$)|$)
并用$1*$2替换模式进行替换。
详细说明:
([^\w.]|^)- 第1组:一个不是点或字母数字字符(\w=[A-Za-z0-9_])或字符串开头(^)的字符[0-9]- 1个数字([^\w.]|\.(?:\D|$)|$)- 第2组:一个不是点或字母数字字符([^\w.])的字符,或者一个跟在.后面的非数字字符或字符串结尾(\.(?:\D|$)),或者字符串结尾($)
替换模式中的$1将组1的内容重新插入结果中,$2将组2的内容重新插入结果中。
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)
}
更新:为了还删除与一个字符分隔的1位整数数字,使用循环检查是否仍然存在匹配项,并进行替换,直到没有匹配项。将s = re.ReplaceAllString(s, "$1*$2")替换为:
for re.MatchString(s) {
s = re.ReplaceAllString(s, "$1*$2")
}
请参见此Go演示。
英文:
Use the following regex:
([^\w.]|^)[0-9]([^\w.]|\.(?:\D|$)|$)
And replace with $1*$2 replacement pattern.
Details:
([^\w.]|^)- Group 1: a char that is not a dot or a word char (\w=[A-Za-z0-9_]) or start of string (^)[0-9]- 1 digit([^\w.]|\.(?:\D|$)|$)- Group 2: a char other than a dot or a word char ([^\w.]), or a.followed with a non-digit or end of string (\.(?:\D|$)) or end of string ($)
The $1 in the replacement pattern re-inserts the Group 1 contents into the result, and $2 does the same with Group 2 contents.
See the regex demo and a Go demo:
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)
}
UPDATE: To also remove 1-digit integer numbers that are separated with 1 char, use a loop to check if a match still occurs, and replace until no match. Replace s = re.ReplaceAllString(s, "$1*$2") with:
for re.MatchString(s) {
s = re.ReplaceAllString(s, "$1*$2")
}
See this Go demo.
答案2
得分: 2
正则表达式\b\d+\b将解决你的问题。以下是Go代码。
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上测试这个正则表达式。
英文:
The regex \b\d+\b will solve your problem. Following is the go code.
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))
}
You can test this regex at https://regex101.com/r/cyCS9C/2
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论