我需要用驼峰Case字符和-
替换一些camelCase字符。
我得到的是一个像这样的字符串:
Albert-Weisgerber-Allee 35
Bruninieku iela 50-10
这些字符串正在通过这个正则表达式来分隔街道上的数字:
$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);
现在,我有两个问题。
我在正则表达式上非常糟糕。
上面的正则表达式也会从街道名称中删除每个-
,并且在德国和欧洲有很多这样的名字。
实际上,调整正则表达式以不剪切任何连字符是很容易的,但我想了解正则表达式是如何工作的,所以我决定尝试找到一个正则表达式,只用字符串替换字符串中的每个驼峰字母。 / p>
- & matched Camel Case letter
除了第一个大写字母外观。
我设法找到一个正则表达式,向我展示了粘贴连字符所需的位置:
.[A-Z]{1}/ug
https://regex101.com/r/qI2iA9/1
但是我该如何替换这个字符串:
AlbertWeisgerberAllee
它变成了
Albert-Weisgerber-Allee
答案 0 :(得分:5)
要在大写之前插入破折号,请使用此正则表达式:
$string="AlbertWeisgerberAllee";
$string=preg_replace("/([a-z])([A-Z])/", "\\1-\\2", $string);
答案 1 :(得分:1)
只需使用捕获组:
(.)([A-Z]) //removed {1} because [A-Z] implicitly matches {1}
并替换为$1-$2
答案 2 :(得分:1)
你似乎过度复杂化了表达。您可以使用以下内容将-
置于除第一个以外的任何大写字母之前:
(.)(?=[A-Z])
只需将其替换为$1-
即可。基本上,这个正则表达式的作用是:
(.)
查找任何角色并将该角色放在第1组中。(?=[A-Z])
查看后面是否包含大写字符。$1-
如果匹配,请替换为第1组中的字符,后跟连字符。