单词与单词的分隔(Regex和PHP)

时间:2019-06-06 21:05:43

标签: php regex

我创建了以下正则表达式代码来查找和分隔单词中的首字母大写。

 $string = "hello worldB. What are you doing now";
 $string = "hello worldB.What are you doing now"; // variant 2
 $clean = preg_replace('/[a-z0-9]+(?:[A-Z].+)/', '? ', $string);

存在正则表达式错误。你能帮我吗?

Demo

3 个答案:

答案 0 :(得分:2)

在您的正则表达式中,点不转义并且与除换行符以外的任何字符匹配。另外,(?:[A-Z].+)是一个非捕获组,其模式正在使用。您要么需要一个捕获组,然后替换就应该包含对该组的反向引用,或者是一个先行的非消耗型模式。

您可以使用

$s = preg_replace('~[a-z0-9](?=[A-Z]\.)~', '$0 ', $s);

请参见regex demo

详细信息

  • [a-z0-9]-小写的ASCII字母
  • (?=[A-Z]\.)-(positive lookahead),后跟一个大写ASCII字母和一个点。

请注意,$0是正则表达式找到的整个匹配值的占位符。

答案 1 :(得分:1)

我猜测我们可能需要一个空格,可以使用以下方式完成该操作:

([a-z])([A-Z])

Demo 1

在这里,如果可能的话,我们不会从右边装订它。

测试

$re = '/([a-z])([A-Z])/m';
$str = 'hello worldB. What are you doing now
hello worldB.What are you doing now
';
$subst = '$1 $2';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;

如果我们只想捕捉到这一点,我们可以使用以下简单表达式:

[a-z]([A-Z])

[a-z]([A-Z])\.

Demo 2

测试

$re = '/[a-z]([A-Z])/m';
$str = 'hello worldB. What are you doing now
hello worldB.What are you doing now
';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

// Print the entire match result
var_dump($matches);

RegEx

如果不需要此表达式,并且希望对其进行修改,请访问regex101.com上的此链接。

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 2 :(得分:0)

您没有限制小组必须重复的次数。如果要在句子中第一个出现大写字母,可以使用以下正则表达式:

[a-z0-9]+([A-Z]{1})

这将与用{1}重复 准确 一次的句子中找到的第一个大写字母匹配。这称为固定量词,有关一般正则表达式量词here的更多信息,请参见。

请参见DEMO

但是,如果您只想查找第一个大写字母,则应使用更具包容性的正则表达式,以匹配空格,特殊字符和其他内容:

.*([A-Z]{1}).*

请参见DEMO