Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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

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
Regex 如何在Golang正则表达式的第一个匹配之前插入子字符串?_Regex_Go - Fatal编程技术网

Regex 如何在Golang正则表达式的第一个匹配之前插入子字符串?

Regex 如何在Golang正则表达式的第一个匹配之前插入子字符串?,regex,go,Regex,Go,我有一个正则表达式,如下所示(ORDER\s+BY)|(LIMIT)|$。我想在正则表达式的第一个匹配之前插入一个子字符串。我在Golang中寻找一个纯regexp解决方案,没有找到索引,然后添加一个子字符串。因为Golang只有regexp.ReplaceAll func,它将替换所有匹配项,而不是第一个匹配项 exp := regexp.MustCompile(`(ORDER\s+BY)|(LIMIT)|$`) fmt.Println(exp.ReplaceAllString(str, ".

我有一个正则表达式,如下所示
(ORDER\s+BY)|(LIMIT)|$
。我想在正则表达式的第一个匹配之前插入一个子字符串。我在Golang中寻找一个纯regexp解决方案,没有找到索引,然后添加一个子字符串。因为Golang只有regexp.ReplaceAll func,它将替换所有匹配项,而不是第一个匹配项

exp := regexp.MustCompile(`(ORDER\s+BY)|(LIMIT)|$`)
fmt.Println(exp.ReplaceAllString(str, "..."))
范例

输入:
abcd按限制排序
substring=
GROUP BY

预期输出:
abcd按订单分组按限额

输入:
abcd限制

预期输出:
abcd按限制分组

您可以使用

str := "abcd ORDER BY LIMIT"
exp := regexp.MustCompile(`^(.*?)(ORDER\s+BY|LIMIT|$)`)
fmt.Println(exp.ReplaceAllString(str, "${1}GROUP BY ${2}"))
如果图案前可能有换行符,请使用前面的
(?s)
(?s)^(.*)(订单\s+按|限制|$)

请参阅和:

详细信息

  • ^
    -字符串的开头
  • (.*)
    -组1(
    ${1}
    ):任何0+字符,尽可能少
  • (ORDER\s+BY | LIMIT |$)
    -第2组(
    ${2}
    ):三种备选方案中的任何一种,以先到者为准:
    • ORDER\s+BY
      -
      ORDER
      ,1+空格,
      BY
    • 限制
      -一个
      限制
      子字符串
    • $
      -字符串结束

我猜这个表达式可能在这里起作用:

(ORDER\s+BY\s+LIMIT|LIMIT)$
试验
regexp.MustCompile(`^(.*)(ORDER\s+BY | LIMIT |$)`).ReplaceAllString(str,${1}GROUP BY${2}”)
,请参阅。非常感谢您解决了这个问题。如果你愿意回答,我可以把它关上@你为什么改变了原来的表达方式?OP不需要更改它,只需在模式第一次出现之前添加文本。此外,
ReplaceAllString
将替换所有匹配项。
package main

import (
    "regexp"
    "fmt"
)

func main() {
    var re = regexp.MustCompile(`(?m)(ORDER\s+BY\s+LIMIT|LIMIT)$`)
    var str = `abcd ORDER BY LIMIT
abcd LIMIT`
    var substitution = "GROUP BY $1"

    fmt.Println(re.ReplaceAllString(str, substitution))
}