Php-Regex在字符串中第一个所有大写字母单词后插入字符


Php Regex to insert character after first all-capital letter word in a string

我正在尝试使用preg_replace或类似的php函数:-识别字符串中的第一个全大写字母单词,-并在其后面直接插入一个字符(可以使用破折号或分号)-全大写字母单词的长度应为3个字符或更多。

到目前为止,我有一个正则表达式:

/(?<!' )([^A-Z{3,}])/

但是,这并不适用于只有3个以上字符的单词。我也不确定我是否"严格地"只看第一个词。

我相信,一旦我整理好正则表达式-这个

$string = "LONDON On November 12th twelve people...";
$replaced_string = preg_replace('/myregex/',': ', $string);

将输出为以下

LONDON: On November 12th twelve people..."

这是一个相当简单的正则表达式,实际上:

$replacedString = preg_replace('/'b([A-Z]{3,})'b/', '$1: ', $string);

它是这样工作的:

  • 'b:字边界。这会检测"单词"的开始和结束
  • ([A-Z]{3,}):匹配3个或3个以上的大写字符。括号捕获了匹配的这一部分,因此我们可以在替换字符串中使用它
  • 'b:另一个单词边界

将此匹配替换为:

  • '$1: '$1指回第一个捕获的组(3个或更多个大写字符)。为此,我们添加了一个冒号和一个空格。那将是我们的替换字符串

这将在所有包含3个或更多字符的大写单词后添加冒号和空格。要只替换一个单词,只需将限制传递给preg_replace:

$replaced = preg_replace('/'b([A-Z]{3,})'b/', '$1: ', $string, 1);

其中,最后一个参数是要替换的匹配数-1代表所有,1代表1,2代表2等…

Demo

根据您的示例字符串判断,大写单词是城市名称。城市名称可以包含破折号,甚至空格。为了解决这个问题,您可能需要匹配所有包含大写字符、破折号和空格的字符串:

$replaceAll = preg_replace('/'b([A-Z -]{2,}[A-Z])'b/', '$1: ', $string);

演示2

发生了什么变化:

  • ([A-Z -]{2,}:捕获匹配以大写字符(2个或更多,而不是3个)开始,但也匹配空格和破折号
  • [A-Z]):捕获组的最后一个字符必须是大写字符,这样可以避免捕获尾部空格或破折号。结果是,我们捕捉到了"纽约"《FOO-TOWN》之类的东西,但没有捕捉到的"ON-Something"

其余的和以前一样。如果您想允许出现其他字符(如点),只需将它们添加到捕获组的第一部分即可。最完整的模式可能是这样的:

$replaced = preg_replace('/'b([A-Z][A-Z .-]+[A-Z])'b/', '$1: ', $string);

这样可以确保捕获的组以大写字符开始和结束,并包含任意数量的大写字符、空格、点和短划线。因此,这将匹配类似"ST.LEWIS"的内容,也匹配