带有大写单词和破折号的正则表达式

时间:2015-12-22 15:39:26

标签: regex preg-match uppercase hyphen

给出如下文本字符串:

  

wikiradio 27/09/2012 - LE QUATTRO GIORNATE DI NAPOLI raccontate da Ida   Gribaudi

     

wikiradio 10/04/2013 - DAG HAMMARSKJOLD raccontato da Susanna Pesenti

我正在使用正则表达式来匹配字符串的大写单词(即" LE QUATTRO GIORNATE DI NAPOLI"" DAG HAMMARSKJOLD" )。 我的代码是这样的:

$title = $_GET["title"];
if (preg_match_all('/\\b(?=[A-Z])[A-Z\' ]+(?=\\W)/',$title,$match)) {

process matched portion...

它几乎总是有效,但是当$ title字符串包含撇号+空格破折号时,它不会。 例如,这两个标题中的大写单词不匹配。

  

wikiradio 11/02/2014 - L' ABBE' PIERRE raccontato da Giovanni Anversa

     

wikiradio 22/12/2015 - JEAN-MICHEL BASQUIAT raccontato da Costantino   d'奥拉齐奥

我错过了什么?

1 个答案:

答案 0 :(得分:3)

这样的事可能适合你:

\b[A-Z].*?(?= [a-z])

Regex online demo

<强>勒亘

    \b         # regex words boundary [1]
    [A-Z]      # any single Uppercase letter
    .*?        # Any char repeatead zero or more in lazy mode
    (?= [a-z]) # matches when the next 2 chars are a space and any single lowercase letter

[1] regex word boundary matches between a regex word char '\w' (also [a-zA-Z0-9_]) 
    and a non word \W ([^a-zA-Z0-9_]) or at start/end of the string 
    (just like '^' and '$')

代码演示 on ideone

<强>更新

使用白色字符列表工作的更新版本(我们无法知道所有可能的字符)

(?m)\b[A-Z][A-Z '-]*(?= |$)

updated version

的在线演示