regex - 如何使用 look after 来匹配单引号或双引号?
问题描述
我有一系列要提取的字符串:
hello.this_is("bla bla bla")
some random text
hello.this_is('hello hello')
other stuff
我需要得到(从许多文件中,但这在这里并不重要)是 and 之间的内容hello.this_is(
,)
所以我想要的输出是:
bla bla bla
hello hello
如您所见,括号内的文本可以用双引号或单引号括起来。
如果这只是单引号,我会使用向后看并向前看,就像这样:
grep -Po "(?<=hello.this_is\(').*(?=')" file
# ^ ^
# returns ---> hello hello
同样,要从双引号中获取字符串,我会说:
grep -Po '(?<=hello.this_is\(").*(?=")' file
# ^ ^
# returns ---> bla bla bla
但是,我想匹配这两种情况,所以它同时得到单引号和双引号。我尝试使用$''
转义,但无法使其工作:
grep -Po '(?<=hello.this_is\($'["\']').*(?=$'["\']')' file
# ^^^^^^^^ ^^^^^^^^
我当然可以使用 ASCII 数字并说:
grep -Po '(?<=hello.this_is\([\047\042]).*' file
但我想使用引号和单引号,因为047
和042
对我来说并没有单引号和双引号那样有代表性。
解决方案
注意:sed
此答案底部的命令仅适用于您的字符串表现良好的字符串,例如
"foo"
或者
'bar'
一旦你的字符串开始行为不端:)就像:
"hello \"world\""
它不再起作用了。
您的输入看起来像源代码。对于稳定的解决方案,我建议使用该语言的解析器来提取字符串。
对于琐碎的用例:
您可以使用sed
. 该解决方案应该适用于任何 POSIX 平台,grep -oP
而仅适用于 GNU grep:
sed -n 's/hello\.this_is(\(["'\'']\)\([^"]*\)\(["'\'']\).*/\2/gp' file
# ^^^^^^^^ ^^
# capture group 2 ^
推荐阅读
- dart - 当具有硬编码的滑动手势时,点击被视为垂直拖动
- php - 对于 WooCommerce 订单上具有已完成状态的特定产品,从特定自定义页面更改信息
- python - 使用 pipenv 启动服务器时 Django 导入错误
- laravel - 在laravel 5.7中将json数组转换为json对象
- python - 如何让这个使用 for 循环的 Python 代码运行得更快?
- python - 如何从从文件中读取的内容中查找 URL
- javascript - Javascript Canvas 仅将图像绘制到缓冲区
- pandas - 如果返回值不为空,如何使用包含 vlookup 更新熊猫?
- python - Kivy,带有可选标签和多列的 RecycleView
- python - Geopandas:无法更改 geopandas 对象的 crs