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

时间:2019-07-04 05:18:26

标签: regex go

我有一个遵循public void openDialog(){ final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); AlertDialog alert = alertDialogBuilder.create(); LayoutInflater inflater = getLayoutInflater(); alertDialogBuilder.setView(inflater.inflate(R.layout.list_example, null)); final EditText a = (EditText) alert.findViewById(R.id.kekekeke); alertDialogBuilder .setMessage("Enter a New Name") .setPositiveButton("Edit Name", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { myRef.child(Utils.object.getKey()).child("sfasf").setValue(a.getText().toString()); } }) 的正则表达式。我想在正则表达式的第一个匹配项之前插入一个子字符串。我在Golang中寻找纯正则表达式解决方案,但没有找到索引,然后添加了子字符串。由于Golang仅具有regexp.ReplaceAll函数,它将替换所有匹配项,而不是第一个匹配项。

(ORDER\s+BY)|(LIMIT)|$

示例

输入:exp := regexp.MustCompile(`(ORDER\s+BY)|(LIMIT)|$`) fmt.Println(exp.ReplaceAllString(str, "...")) 子串= abcd ORDER BY LIMIT

预期输出:GROUP BY

输入:abcd GROUP BY ORDER BY LIMIT

预期输出:abcd LIMIT

2 个答案:

答案 0 :(得分:2)

您可以使用

str := "abcd ORDER BY LIMIT"
exp := regexp.MustCompile(`^(.*?)(ORDER\s+BY|LIMIT|$)`)
fmt.Println(exp.ReplaceAllString(str, "${1}GROUP BY ${2}"))

如果在模式之前可以使用换行符,请在前面使用(?s)。{p>

请参见Go demoregex graph

enter image description here

详细信息

  • (?s)^(.*?)(ORDER\s+BY|LIMIT|$)-字符串的开头
  • ^-组1((.*?)):任意0个以上的字符,数量尽可能少
  • ${1}-第2组((ORDER\s+BY|LIMIT|$)):三种选择中的任何一种,以先到者为准:
    • ${2}-ORDER\s+BY,1个以上的空格,ORDER
    • BY-一个LIMIT子字符串
    • LIMIT-字符串的结尾。

答案 1 :(得分:0)

我的猜测是,该表达式可能在这里起作用:

(ORDER\s+BY\s+LIMIT|LIMIT)$

Demo

测试

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))
}