正则表达式用字符本身和连字符替换字符

chr*_*con 6 php regex string

我需要用驼峰Case字符和a替换一些camelCase字符-.

我得到的是一个像这样的字符串:

Albert-Weisgerber-Allee 35
Bruninieku iela 50-10
Run Code Online (Sandbox Code Playgroud)

这些字符串正在通过这个正则表达式来分隔街道上的数字:

$data = preg_replace("/[^ \w]+/", '', $data);
$pcre = '\A\s*(.*?)\s*\x2f?(\pN+\s*[a-zA-Z]?(?:\s*[-\x2f\pP]\s*\pN+\s*[a-zA-Z]?)*)\s*\z/ux';
preg_match($pcre, $data, $h);
Run Code Online (Sandbox Code Playgroud)

现在,我有两个问题.

  1. 我在正则表达式上非常糟糕.

  2. 上面的正则表达式也削减-了街道名称中的每一个,并且在德国和欧洲有很多这样的名字.

实际上,调整正则表达式以便不剪切任何连字符是很容易的,但我想了解正则表达式是如何工作的,所以我决定尝试找到一个正则表达式,只替换字符串中的每个驼峰字母.

- & matched Camel Case letter
Run Code Online (Sandbox Code Playgroud)

除了第一个大写字母外观.

我已经设法找到一个正则表达式,向我显示我需要粘贴连字符的地方,如下所示:

.[A-Z]{1}/ug     
Run Code Online (Sandbox Code Playgroud)

https://regex101.com/r/qI2iA9/1

但是我怎么替换这个字符串:

AlbertWeisgerberAllee 
Run Code Online (Sandbox Code Playgroud)

它变成了

Albert-Weisgerber-Allee
Run Code Online (Sandbox Code Playgroud)

小智 5

要在大写之前插入破折号,请使用此正则表达式:

$string="AlbertWeisgerberAllee";
$string=preg_replace("/([a-z])([A-Z])/", "\\1-\\2", $string);
Run Code Online (Sandbox Code Playgroud)