【问题标题】:regex with uppercase words and dash带有大写单词和破折号的正则表达式
【发布时间】:2015-12-22 15:39:26
【问题描述】:

给定文本字符串,例如:

wikiradio 27/09/2012 - LE QUATTRO GIORNATE DI NAPOLI raccontate da Ida 格里巴迪

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 多拉齐奥

我错过了什么?

【问题讨论】:

  • 我想知道你不能只取第一个破折号后的所有字符,然后停在第一个空格后面跟一个小写字母。这就像/- .*?(?= [a-z])/ 一样简单。 Demo.
  • 这是一个有趣的解决方法。

标签: regex preg-match uppercase hyphen


【解决方案1】:

这样的事情可能对你有用:

\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的在线演示

【讨论】:

  • 如果大写单词后面没有小写字母,这会起作用吗?
  • @Barmar:看看更新后的版本能不能满足你的情况,谢谢你的观察
猜你喜欢
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多