捕获第二个带引号的字符串,而无需在后跟引号/定界符

时间:2019-04-12 20:22:22

标签: regex

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

"foo": "bar"

我正在尝试仅提取"bar",不要使用引号

我想出了这个:

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

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

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

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

[^"]*(?="$)

答案 1 :(得分:2)

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

也就是说,此正则表达式将仅与捕获的组中第二个带引号的字符串匹配:

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

Demo

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

>

答案 2 :(得分:0)

签出

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

答案 3 :(得分: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的答案"[^"]+"\s*:\s*"([^"]+)(?=")不管长短都将获得第二名

但是,要获取组,您可以使用:

"([^"]*)"

然后通过您选择的编程来获得所需的组