捕获第二个引用的字符串,不带尾随引号/分隔符

问题描述 投票:0回答:4

这里有一个新的正则表达式学习器,我有一个字符串可靠地用冒号分隔两个带引号的字符串,如:

"foo": "bar"

我试图在没有引号的情况下提取"bar"

我想出来了:

\:([^"]*"){2}

这给了我:bar"在第二场比赛,但我正在努力找出一种方法来消除尾随的引用。

很感谢任何形式的帮助!

regex
4个回答
3
投票

您可以使用预测来验证后面的双引号也是输入中的最后一个字符:

[^"]*(?="$)


2
投票

您最好的方法取决于您正在使用的正则表达式的风格。有一些技巧可以让你只匹配你想要的作品。

也就是说,这个正则表达式只匹配捕获组中的第二个引用字符串:

"[^"]+"\s*:\s*"([^"]+)(?=")

Demo

如果你确定你没有任何其他类型的字符串,并且该字符串将在最终引号后立即终止,那么trincot's answer更简单,更好。


0
投票

看一下这个

echo '"foo":"bar"' | awk -F':' '{gsub(/"/, "", $2); print $2}'

0
投票

我发现使用\K (Keep text out of the regex match)很容易记住这种模式:

\s"\K.+(?=")

它可以理解为:

  • 忽略空间前面的所有内容和“\s"\K(删除"foo": "
  • 然后得到一切,直到第一个"找到.+(?="),所以ti将返回只是bar

这种方法的问题在于,如果你有更大的东西,你总是需要具有相同的输入/模式的项目,例如:

"bla": "foo": "bar"

将返回:

foo": "bar

@trincot回答[^"]*(?="$)保证总是得到""中的最后一项,所以你可以有"bla": "foo": "bar"并且总是得到bar

@ ed-cottrell回答qazxsw poi无论长度如何都会获得第二名

但是,要获得可以使用的组:

"[^"]+"\s*:\s*"([^"]+)(?=")

然后根据您的选择编程获得所需的组

© www.soinside.com 2019 - 2024. All rights reserved.