英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论