golang regexp替换单个数字
我试图替换单个数字,但前提是它们不伴有单词字符。例如golang regexp替换单个数字,regex,go,Regex,Go,我试图替换单个数字,但前提是它们不伴有单词字符。例如 [*:*:1]a2b*d 3n 4q测试5测试6 应该换成 [*:*:*]a2b*d 3n 4q测试*测试* 在上面的列表中,数字1、5和6已被替换为*,但2、3和4没有被替换,因为它们带有一个单词字符 下面的代码可以工作,但只是部分工作 在这里,我希望保留第一个单词中的:和],并保留5周围的空格。此外,6未被更换 关于如何在Go中实现这一点的任何建议。使用以下正则表达式: ([^\w.]|^)[0-9]([^\w.]|\.(?:\D|$)
[*:*:1]a2b*d 3n 4q测试5测试6
应该换成
[*:*:*]a2b*d 3n 4q测试*测试*
在上面的列表中,数字1、5和6已被替换为*,但2、3和4没有被替换,因为它们带有一个单词字符
下面的代码可以工作,但只是部分工作
在这里,我希望保留第一个单词中的:
和]
,并保留5
周围的空格。此外,6
未被更换
关于如何在Go中实现这一点的任何建议。使用以下正则表达式:
([^\w.]|^)[0-9]([^\w.]|\.(?:\D|$)|$)
并替换为$1*$2
替换模式
详细信息:
-第1组:不是点或字字符的字符(([^\w.]|^)
=\w
)或字符串开头([a-Za-z0-9\]
)^
-1位[0-9]
-第2组:点或字字符以外的字符(([^\w.]\124;\(?:\ D |$)\124;$)
),或后跟非数字或字符串结尾([^\w.]
)或字符串结尾(\(?:\D |$)
$/code>)
$1
将第1组内容重新插入结果,而$2
对第2组内容执行相同的操作
见附录a和a:
更新:若要删除以1个字符分隔的1位整数,请使用循环检查是否仍存在匹配,并替换,直到没有匹配为止。将s=re.ReplaceAllString(“$1*$2”)
替换为:
for re.MatchString(s) {
s = re.ReplaceAllString(s, "$1*$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))
}
您可以在处测试此正则表达式是否存在类似于
3.5的值?预期的行为是什么?保留3.5
?很好,你问了这个问题。应保留3.5。我已更新以确保仅替换1个独立数字,所有3.5
的情况现在都已正确处理。此处3-5
无法正常工作。它代替了类似*-5
。但是它应该是3-5,我为它添加了补丁。这是因为重叠的匹配。应使用相同的正则表达式执行检查。如果存在匹配项,则继续替换。这是我能想到的唯一解决办法,因为Go regex甚至不支持lookaheads。这也有效,只是没有保留3.5部分。@FizerKhan:将单个数字(或仅整数)与regex匹配是一个常见的问题,避免匹配浮点值的部分。通常的解决方法是添加(?lookback和(?!\。\d)
lookahead,但Go不支持lookarounds。请参阅我的答案以了解解决方法。@Wiktor明白了。我不知道Go支持什么。我以为他想将所有数字(整数或浮点)替换为“*”。是的,我明白了。(注意,我的意思是Go regex不支持lookarounds。)
for re.MatchString(s) {
s = re.ReplaceAllString(s, "$1*$2")
}
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))
}