给出如下文本字符串:
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'奥拉齐奥
我错过了什么?
答案 0 :(得分:3)
这样的事可能适合你:
\b[A-Z].*?(?= [a-z])
<强>勒亘强>
\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 '-]*(?= |$)
的在线演示