我有一个这样的条目:
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也是不正确的。我在正则表达方面并不擅长,我只花了三个小时就这么做,所以我希望有人能给我一个指针。谢谢!
答案 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'
];
您也可以看到它同时捕获Beetle
和Mé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
)
)