英文:
Go lang get matching substring from string
问题
我正在尝试从字符串中提取所有在引号之间的单词。
这是我的当前代码:
func StrExtract(word string) []string {
r, _ := regexp.Compile(`".*"`)
result := r.FindAllString(word, -1)
RemoveDuplicates(&result)
return result
}
在这里测试代码
输入如下:
`Hi guys, this is a "test" and a "demo" ok?`
我得到的输出是:
["test" and a "demo"]
但我想要得到的是:
[test demo]
请帮我修复这个问题,或者提供更好的解决方案。
英文:
I'm trying to extract all words from a string which are between quotes.
Here's my current code:
func StrExtract(word string) []string {
r, _ := regexp.Compile(`".*"`)
result := r.FindAllString(word, -1)
RemoveDuplicates(&result)
return (result)
}
Test the code here
With an input like:
`Hi guys, this is a "test" and a "demo" ok?`
I get the output:
["test" and a "demo"]
But I'd like to get:
[test demo]
Please help me fix this, or suggest better alternatives.
答案1
得分: 2
你可以简单地添加一个懒惰量词.*?
,即正则表达式".*?"
,如果你想保持简单。你之所以得到"test" and a "demo"
,是因为.*
是贪婪的,它会尽可能匹配尽量多的文本(因此,它实际上匹配了test
之前和demo
之后的"
,忽略了它们之间的其他引号)。
通常,更好但在某些方面稍微复杂一些的方法是使用字符类"[^"]*"
,禁止匹配引号之间的引号。这也可能导致一些其他行为,比如包括换行符(在这种情况下,你也可以禁用它们[^"\n]
,或者你实际上想要这种情况)。
由于你还想去掉引号,需要进行一些额外的操作。你可以使用回顾后发断言:(?<=")[^"]*(?=")
,或者使用捕获组:"(.*?)"
和"([^"]*)"
。如果你选择使用捕获组的方法,你必须使用捕获组,而不是整个匹配。
英文:
You can just add a lazy quantifier .*?
, ".*?"
being the regex, if you want to keep it simple. The reason you are getting "test" and a "demo"
is because just .*
is greedy and matches as much text as possible (therefore, it actually matches the "
before test
and after demo
, ignoring the fact that there are other quotes in between).
Normally a better but in some ways slightly more complicated way to do this is using character classes "[^"]*"
, disabling matching quotes in between. This can also cause some other behaviors like including newlines (in which case you can also disable them [^"\n]
, or perhaps you actually want such a case)
Since you want to also not have the quotes some additional things need to be done. You can do that with either lookarounds: (?<=")[^"]*(?=")
, or with capture groups: "(.*?)"
and "([^"]*)"
. If you choose the capture group route, you have to use the capture group, not whole matches.
答案2
得分: 2
正则表达式:
"(.*?)"
这是一个在线演示:
https://regex101.com/r/sI4tA9/1
现在你需要做的就是将匹配项连接起来。不幸的是,我对go
不太了解,所以在这种情况下无法帮助你。
英文:
Regex:
"(.*?)"
Here is an online demo:
https://regex101.com/r/sI4tA9/1
All you have to do now is to join matches. Unfortunately I'm not so into go
that's why I can't help you in that case
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论