用第一个大写字母提取一个或多个连续单词


Extract one or more consecutive words with first capital letter

我做了一个正则表达式来提取一个或多个带有第一个大写字母的连续单词。我需要带有重音字母的它,但这些字母会搞砸表达式,产生错误的输出。

这是一个例子:http://www.phpliveregex.com/p/eHE(选择preg_match_all)

我的正则表达式:

/([ÁÉÍÓÚÑA-Z]+[a-záéíóúñ]*['s]{0,1}){1,}/

测试字符串:

Esto es una prueba para extraer diferentes nombres de personas como Fernández Díaz, Logroño, la Comunidad Valenciana, o también siglas como AVE, y cualquier cosa que empiece por mayúscula y tenga una o varias palabras.

在这种情况下,不应出现"úscula","én"。

preg_match_all('/('b'p{Lu}'p{L}+'s*)+/u', $input, $output);

这是假设"单词"仅由字母组成,并且只有由空格字符分隔的单词才被认为是连续的。

演示:http://www.phpliveregex.com/p/eHG

如注释中所述,匹配字母(包括所有重音版本)的方法是将'p转义序列与 u(unicode) 修饰符结合使用:

选择 UTF-8 模式时,可以使用其他转义序列来匹配通用字符类型。

''p{xx}
    具有 xx 属性的字符

L     字母包括以下属性:Ll、Lm、Lo、Lt 和 Lu。
Ll    小写字母
Lm  修饰符字母
   罗其他信件
Lt   标题案例信
   卢 大写字母

因此,您可以使用此正则表达式:

'b(?!['h,])(?:['h,]*'p{Lu}'pL*)+

此表达式检查匹配项是否不以水平空格 ( 'h ) 或逗号开头,但随后匹配由这些空格分隔的单词。如果这不是您想要的,您可以删除逗号,或者另一方面,如果需要,可以将其他标点符号添加到该列表中。

请注意,PHP 要求在'p修饰符后放置多个字母时使用大括号。

查看 PHP 实时正则表达式

示例代码(请参阅 eval.in):

$text = "Esto es una prueba para extraer diferentes nombres de personas " .
        "como Fernández Díaz, Logroño, la Comunidad Valenciana, o también " .
        "siglas como AVE, y cualquier cosa que empiece por mayúscula " .
        "y tenga una o varias palabras.";
preg_match_all('/'b(?!['h,])(?:['h,]*'p{Lu}'pL*)+/u', $text, $matches); 
var_export($matches);

输出:

array (
  0 => 
  array (
    0 => 'Esto',
    1 => 'Fernández Díaz, Logroño',
    2 => 'Comunidad Valenciana',
    3 => 'AVE',
  ),
)

如果没有正则表达式中的逗号,"费尔南德斯·迪亚斯,洛格罗尼奥" 将最终出现在单独的比赛中:

array (
  0 => 
  array (
    0 => 'Esto',
    1 => 'Fernández Díaz',
    2 => 'Logroño',
    3 => 'Comunidad Valenciana',
    4 => 'AVE',
  ),
)