这里是新的正则表达式学习者,我有一个字符串,该字符串可靠地是两个用冒号分隔的带引号的字符串,例如:
"foo": "bar"
我正在尝试仅提取"bar"
,不要使用引号
我想出了这个:
\:([^"]*"){2}
这给了我:bar"
,在第二场比赛中,但是我正在努力寻找一种消除尾随引号的方法。
非常感谢您的帮助!
答案 0 :(得分:3)
您可以使用预读来验证后面的双引号也是输入中的最后一个字符:
答案 1 :(得分:2)
您的最佳方法取决于您使用的正则表达式的风格。有一些技巧可以使您只匹配想要的作品。
也就是说,此正则表达式将仅与捕获的组中第二个带引号的字符串匹配:
"[^"]+"\s*:\s*"([^"]+)(?=")
如果您确定不会有任何种其他类型的字符串,并且该字符串将在最后一个引号后立即终止,那么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*"([^"]+)(?=")
不管长短都将获得第二名
但是,要获取组,您可以使用:
"([^"]*)"
然后通过您选择的编程来获得所需的组