0

我想找到一个以 . 开头http://和结尾的字符串.com。但是http://and.com它不需要打印。

$str = "http://example.com";
$str =~ /http:\/\/example.com/;$result = "$&\n";
print $result; 

基本上与使用 python 完成的相同。

#!/usr/bin/python
import re
str = 'http://example.com'
search = re.search(r'http://(\w+).com', str)
if search:
  print search.group(1)

它只会显示“示例”。如何在 Perl 中做到这一点?

4

4 回答 4

3

具有专用解析器的强大解决方案:

use feature 'say';
use strict; use warnings;

use URI;
use URI::Find;

URI::Find->new(sub {
    my $uri = shift;
    say $uri->host =~ m{(\w+)[.]com\z};
})->find(\ (my $x = q{http://example.com/}) );
于 2012-05-18T10:09:34.687 回答
0

试试这个简单的代码:

$str = 'http://example.com'; 
print "$_\n" for $str =~ m{\A http:// (\w+) [.] com \z}x;

为确保您的结果是完整的,请将模式锚定在开头\A, 和结尾, \z/使用与避免倾斜牙签综合症不同的模式分隔符,并使用该x选项使您的模式更具可读性。

您需要使用(...)来捕获要提取的部分。

您可以在ideone.com上测试此代码

于 2012-05-18T12:48:39.700 回答
0

下面不是那么糟糕的解决方案:

$str = 'http://example.com';

if (($url) = $str =~ /http:\/\/(\w+)\.com/) {
    print $url, "\n";
}
于 2012-05-18T15:28:27.017 回答
-1

在您的 Python 代码段中,您使用括号捕获所需的文本,但在您的 Perl 代码段中,您将它们排除在外。此外,您要捕获的部分是硬编码的,而不是表示为\w+. 在那里挖。

于 2012-05-18T10:06:22.110 回答