Golang正则表达式匹配字符串,直到给定的字符序列

我有一个字符串,该字符串可能带有-name,后跟值(可以有空格),也可能有 -descr后跟一个值(-descr后跟一个值,可能也可能不存在):</ p>

示例字符串:</ p>

  runcmd -name abcd xyz -descr abc def 
</ code> </ pre>

or </ p>

  runcmd -name abcd xyz 
< / code> </ pre>

使用Go语言,我该如何编写regexp,如果存在-descr,它将返回给我字符串。 因此,对于上述两个示例,结果应为:</ p>

  runcmd -name abcd xyz 
</ code> </ pre>

尝试:</ p>

  regexp.MustCompile((-name)。+?=-descr
</ code> </ pre>

但是,那没有返回任何匹配。 我想知道正确的正则表达式来获取直到-descr的字符串</ p>
</ div>

展开原文

原文

I have a string that could have a -name followed by value (that can have spaces) and there could also be -descr after that followed by a value (the -descr followed by value may nor may not be there):

Example strings:

runcmd -name abcd xyz -descr abc def

or

runcmd -name abcd xyz

With Go language, how do I write regexp, that returns me the string before -descr if it exists. so, for both examples above, the result should be:

runcmd -name abcd xyz

I was trying:

regexp.MustCompile(`(-name ).+?=-descr`)

But, that did not return any match. I wanted to know the correct regexp to get the string up until -descr if it exists

dtcwehta624485
dtcwehta624485 为什么要使用正则表达式执行如此简单的任务?
一年多之前 回复
duanlang0025
duanlang0025 是的,当没有-descr时,它应该匹配并返回runcmd-nameabcdxyz
一年多之前 回复
douqianni4080
douqianni4080 我的意思是,当没有-descr时,您还应该匹配runcmd-nameabcdxyz吗?
一年多之前 回复
dongpa3109
dongpa3109 我想从比赛中排除-descr
一年多之前 回复
dsykx64220
dsykx64220 这个捕获小组将与Golang合作吗?您可以告诉语法与regex.MustCompile一起使用吗?
一年多之前 回复
douhui7136
douhui7136 -descr应该在那里吗?因为它不在第二个示例中。
一年多之前 回复
dousi4472
dousi4472 如果可以使用捕获组,请尝试^(。*?-name。*?)(?:*-descr|$)演示
一年多之前 回复
dongshanya2008
dongshanya2008 当您说某事“不起作用”时,重要的是要解释如何做-错误,不正确的行为(并指定原因)等。但是,仅通过查看代码,您的正则表达式就在其中查找带有=的字符串,但您的榜样不包含该角色。
一年多之前 回复

3个回答



您可以在组中用 -name </ code>捕获第一部分,然后匹配两者之间的内容并使用 可选的第二个捕获组来匹配 -descr </ code>及其后的内容。</ p>

然后,您可以在创建所需结果时使用捕获组。</ p>
\ n

  ^(。*?-name \ b)。*?(-descr \ b。*)?$ 
</ code> </ pre>

正则表达式演示 | 进行演示 </ p>

例如:</ p>

  s:=“ runcmd -name abcd xyz -descr abc def” 
re1:= regexp.MustCompile(^(。*?-name \ b)。*?(-descr \ b。*) ?$
result:= re1.FindStringSubmatch(s)
fmt.Printf(result [1] +“ ...” + result [2])
</ code> </ pre>

< p>结果:</ p>

  runcmd -name ...- descr abc def 
</ code> </ pre>
</ div>

展开原文

原文

You could capturin first part with -name in a group, then match what is in between and use an optional second capturing group to match -descr and what follows.

Then you could use the capturing groups when creating the desired result.

^(.*? -name\b).*?(-descr\b.*)?$

Regex demo | Go demo

For example:

s := "runcmd -name abcd xyz -descr abc def"
re1 := regexp.MustCompile(`^(.*? -name\b).*?(-descr\b.*)?$`)
result := re1.FindStringSubmatch(s)
fmt.Printf(result[1] + "..." + result[2])

Result:

runcmd -name...-descr abc def

doutang3077
doutang3077 让我们继续聊天中的讨论。
一年多之前 回复
dongxiong5546
dongxiong5546 我已使用最新示例更新了答案。
一年多之前 回复
douan3414
douan3414 在这种情况下,您可以将第二个捕获组设为ideone.com/V6bGpF
一年多之前 回复
dongy44342
dongy44342 是的,但是对于inputstr s =“ runcmd -name abcd xyz”(即,缺少-descr选项),它似乎失败了
一年多之前 回复
dongqun9403
dongqun9403 您可以将组ideone.com/aHwa3L连接起来
一年多之前 回复
douci2015
douci2015 对不起,如果它变得混乱。 让我尝试使其更简单。 对于inputstr =“ runcmd -name abcd xyz -descr abc def”,我希望输出为“ runcmd -name .... -descr abc def”
一年多之前 回复
duanhuang7591
duanhuang7591 您是说要使用2个捕获组吗? ideone.com/vOTdLz
一年多之前 回复
dongwei7048
dongwei7048 如果您可以共享一个示例,该示例给出上面的代码所示的输出(值为-name的字符串替换为....的字符串),那真的有帮助
一年多之前 回复
duanpan7011
duanpan7011 不知道,如果我足够清楚,我想修改regexp,以便s:=“ runcmd -name abcd xyz -descr abc def” re1:= regexp.MustCompile(regexp)fmt.Println(re1.ReplaceAllString(s, “ $ 1” +“ ....” +“”))应该为'runcmd -name .... -descr abc def'
一年多之前 回复
dongyuduan1890
dongyuduan1890 要仅获取第一组,可以使用^(。*?-name)演示。 在这种情况下,您也可以只使用一个匹配项来代替^。*? -name演示,它看起来像这样的Go演示
一年多之前 回复
doukuiqian5345
doukuiqian5345 是否可以修改它,以便第一组仅包含uptil -name? 原因是,我最终将需要执行类似re1.ReplaceAllString(s,“ $ 1” +“ ....” +“”))之类的操作,因此我可以将-name的值替换为原始字符串 ....,因此输出字符串变为runcmd -name .... -descr abc def这是最终目标
一年多之前 回复



通过“不起作用”,您是说它与任何内容都不匹配,还是与您的期望不符?</ p>

https://regex101.com/ 在测试正则表达式时通常非常有用。 / p>

我不认为有一种简单的方法可以实现您想要的目标。 如果我们假设在 -name </ code>和 -descr </ code>之间的文本不包含任何-</ code>,则情况变得简单得多。 > regex.MustCompile(-name([^-] *))</ code>应该可以工作</ p>

使用这种方法,通常更容易使用两个正则表达式 。 因此,第一个删除 -descr </ code>及其后的所有内容,第一个匹配 -name </ code>和所有后续字符。</ p>
</ div>

展开原文

原文

By "Does not work", do you mean it doesn't match anything, or just not what you expect?

https://regex101.com/ is generally very helpful when testing regular expressions.

I do not believe there's a simple way to achieve what you want. Things become a lot simpler if we can assume the text betweeen -name and -descr doesn't contain any - in which case, regex.MustCompile(`-name ([^-]*)`) should work

With this kind of thing, often it's easier and clearer to use 2 regular expressions. So the first strips -descr and anything following it, and the first matches -name and all subsequent characters.

duanjianshen4871
duanjianshen4871 -name和-descr之间的文本不包含任何-
一年多之前 回复

You are not dealing with a regular language here, so there is no reason to bust out the (slow) regexp engine. The strings package is quite enough:

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func main() {
    fmt.Printf("%q
", f("runcmd -name abcd xyz -descr abc def"))
    fmt.Printf("%q
", f("runcmd -name abcd xyz"))
    fmt.Printf("%q
", f("-descr abc def"))
}

func f(s string) string {
    if n := strings.Index(s, "-descr"); n >= 0 {
        return strings.TrimRightFunc(s[:n], unicode.IsSpace)
    }
    return s
}

// Output:
// "runcmd -name abcd xyz"
// "runcmd -name abcd xyz"
// ""

Try it on the playground: https://play.golang.org/p/RFC65CYe6mp

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐