Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用perl在和向前看和向后看字符串之间提取文本,而无需应用两次?_Regex_Macos_Perl_Uri - Fatal编程技术网

Regex 如何使用perl在和向前看和向后看字符串之间提取文本,而无需应用两次?

Regex 如何使用perl在和向前看和向后看字符串之间提取文本,而无需应用两次?,regex,macos,perl,uri,Regex,Macos,Perl,Uri,我目前有一个字符串: https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing 我想从中提取j2903r293rj092j3r20。我正在Mac OS中使用标准的perl安装。我有 URL="https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing" echo $URL | perl -pe 's/https\:\/

我目前有一个字符串:

https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing
我想从中提取
j2903r293rj092j3r20
。我正在Mac OS中使用标准的perl安装。我有

URL="https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing"
echo $URL | perl -pe 's/https\:\/\/drive.google.com\/file\/d\///g' | perl -pe 's/\/view\?usp=sharing//g'

在这里,我将perl应用于前面和后面。有没有办法一步到位?谢谢

您可以在一个perl-pe命令中用逗号分隔两部分:

echo $URL | perl -pe 's/https\:\/\/drive.google.com\/file\/d\///g','s/\/view\?usp=sharing//g'
当然

首先,在这里使用替换运算符(
s/../…/
)是错误的工具。您可以使用匹配运算符(
m/../
)仅提取所需的字符串位

echo $URL | perl -pe 'm/https\:\/\/drive.google.com\/file\/d\/(\w+)/ and $_ = $1'
这里,我们使用“捕获括号”将URL中
/d/
后面的“单词字符”(字母数字和下划线)字符串复制到变量
$1
中。然后我们将其复制到
$\uu
中,因为这是
-p
将自动打印的变量

但我们可以做得更好。
s/../../../
m/../../
都允许我们更改分隔符,这样我们就不必逃避所有这些斜杠

echo $URL | perl -pe 'm[https://drive.google.com/file/d/(\w+)] and $_ = $1'
我们可以直接使用
print
删除结尾处稍微令人困惑的变量赋值

echo $URL | perl -ne 'print m[https://drive.google.com/file/d/(\w+)]'
而且,如果我们知道我们的输入数据总是看起来像当前的示例,那么实际上就没有必要包含这么多URL

echo $URL | perl -ne 'print m[/d/(\w+)]'
更新:您收到一条评论,建议您使用解析字符串。我不认为这是特别有用的,因为模块将为您提供URL的路径部分,您仍然需要提取路径的正确部分。但是,为了完整起见,这里有一个使用该模块的示例:

echo $URL | perl -MURI -ne 'print +(URI->new($_)->path_segments)[3]'

我们从输入中创建一个URI对象,并立即调用它的
path\u segments()
方法来获取路径的段。我们打印返回的列表的第四个元素。

解析URL时,最好使用适当的解析器,例如

这张照片是:

j2903r293rj092j3r20
我想如果你需要一行的话,应该是这样的:

perl -MURI -lne'$u = URI->new($_); print (( $u->path_segments )[-2])'

既然您将问题标记为,我想像这样简单的
sed
命令没有什么问题

echo "$s" | sed -n 's,.*/d/\([^/]*\).*,\1,p'

匹配所有小于或等于
/d/
,捕获下一个字符,直到第一个
/
或字符串结尾,然后匹配其余字符。替换为第一个组的内容并仅打印该值。

可能
perl-pe的/*\/([^\/]+)\/.*/$1/'文件
,请参阅。可能这应该通过适当的解析器解决。不要使用正则表达式解析URL。这是一个已解决的问题。使用Perl附带的URI模块。可能是类似的
echo'https://drive.google.com/file/d/j2903r293rj092j3r20/view?usp=sharing“| perl-ne'@parts=split'/”;打印$parts[-2]'
--输出
j2903r293rj092j3r20
@PolarBear
perl-F/-lane'print$F[-2]'
更短。但我认为使用解析器更好。虽然逗号分隔列表确实有效,分号是一种更标准的样式,不太可能让人混淆。
echo "$s" | sed -n 's,.*/d/\([^/]*\).*,\1,p'