如果只在正则表达式的括号中使用句点或单个字符,我该如何做多个回溯的单词?

时间:2012-01-26 15:29:01

标签: regex

我有一个这样的条目:

Beetle as creator. So. Am. Indian (Lengua): Métraux BBAE CXLIII (1) 367 (Guaranyi):  

我试图解析以找到部落的名字。我希望能够得到。上午。 Indian,Lengua和Guaranyi,但避免使用(1)。

到目前为止我已经得到了这个:

\w+.[A-Za-z0-9_.()]+:| \(.*?\)  

这给了我Indian,Lengua和Guaranyi,但367也是不正确的。我在正则表达方面并不擅长,我只花了三个小时就这么做,所以我希望有人能给我一个指针。谢谢!

1 个答案:

答案 0 :(得分:0)

区分部落和常用词的标准对我来说并不是很清楚,但这是在perl中的尝试:

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dumper;
use utf8;

my $str = 'Beetle as creator. So. Am. Indian (Lengua): Métraux BBAE CXLIII (1) 367 (Guaranyi): ';
my @tribes = $str =~ /((?:\p{Lu}\p{Ll}+\.?\s?)+)/g;
print Dumper\@tribes;

<强>解释

/               : Regex delimiter
  (             : Begin capture group 1
    (?:         : Begin non capture group
      \p{Lu}    : An uppercase letter
      \p{Ll}+   : One or more lowercase letter
      \.?       : A dot 0 or 1 time
      \s?       : A space 0 or 1 time
    )+          : End non capture group repeated 1 or more time
  )             : End of captur group
/               : Regex delimiter
g               : Global search

<强>输出:

$VAR1 = [
      'Beetle ',
      'So. Am. Indian ',
      'Lengua',
      'Métraux',
      'Guaranyi'
    ];

您也可以看到它同时捕获BeetleMétraux

php中的相同代码:

$str = 'Beetle as creator. So. Am. Indian (Lengua): Métraux BBAE CXLIII (1) 367 (Guaranyi): ';
preg_match_all('/((?:\p{Lu}\p{Ll}+\.?\s?)+)/u', $str, $tribes);
print_r($tribes);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => Beetle
            [1] => So. Am. Indian
            [2] => Lengua
            [3] => Métraux
            [4] => Guaranyi
        )

    [1] => Array
        (
            [0] => Beetle
            [1] => So. Am. Indian
            [2] => Lengua
            [3] => Métraux
            [4] => Guaranyi
        )

)