【问题标题】:How do I match a Russian word in Unicode text using Perl?如何使用 Perl 匹配 Unicode 文本中的俄语单词?
【发布时间】:2010-10-23 00:53:03
【问题描述】:

我有一个我想在其上进行正则表达式的网站,比如 http://www.ru.wikipedia.org/wiki/perl 。该网站是俄语的,我想提取所有俄语单词。与\w+ 匹配不起作用,与\p{L}+ 匹配会检索所有内容。

我该怎么做?

【问题讨论】:

  • 这正是 Unicode 属性的用途。使用 \p{西里尔}。

标签: regex perl unicode


【解决方案1】:

所有这些答案都过于复杂。使用这个

$text =~/\p{cyrillic}/

砰。

【讨论】:

  • 其实应该是$text =~ /\p{Cyrillic}/
【解决方案2】:
perl -MLWP::Simple -e 'getprint "http://ru.wikipedia.org/wiki/Perl"'
403 Forbidden <URL:http://ru.wikipedia.org/wiki/Perl>

好吧,那没用!

先下载一份,好像可以了:

use Encode;

local $/ = undef;
my $text = decode_utf8(<>);

my @words = ($text =~ /([\x{0400}-\x{04ff}]+)/gs);

foreach my $word (@words) {
  print encode_utf8($word) . "\n";
}

【讨论】:

  • 维基百科似乎阻止了 LWP::Simple 请求。如果您更改用户代理字符串,它可能会起作用。
  • 我认为您的意思是\x{0401}-\x{042f} 用于俄语单词。无需过度匹配字符。检查unicode表here
【解决方案3】:

好的,那就试试这个:

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

my $response = $ua->get("http://ru.wikipedia.org/wiki/Perl");

die $response->status_line unless $response->is_success;

my $content = $response->decoded_content;

my @russian = $content =~ /\s([\x{0400}-\x{052F}]+)\s/g;

print map { "$_\n" } @russian;

我相信西里尔文字符集以0x0400 开头,而西里尔文补充字符集以0x052F 结尾,所以这应该得到很多单词。

【讨论】:

  • 感谢您抛出警告:“retrieveFromWiki.pl 第 45 行的模式匹配 (m//) 中格式错误的 UTF-8 字符(在 0x4043e433 处溢出,字节 0xd1,在开始字节 0xbf 之后)。”并检索所有内容,包括英文术语(英文字符)
【解决方案4】:

把这个留在这里。 匹配特定的俄语单词

use utf8;
...
utf8::decode($text);
$text =~ /привет/;

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多