Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang regexp替换单个数字_Regex_Go - Fatal编程技术网

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
替换模式

详细信息

  • ([^\w.]|^)
    -第1组:不是点或字字符的字符(
    \w
    =
    [a-Za-z0-9\]
    )或字符串开头(
    ^
  • [0-9]
    -1位
  • ([^\w.]\124;\(?:\ D |$)\124;$)
    -第2组:点或字字符以外的字符(
    [^\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))
}