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

时间:2015-06-13 20:30:57

标签: php regex string

我需要用驼峰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);

现在,我有两个问题。

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

  2. 上面的正则表达式也会从街道名称中删除每个-,并且在德国和欧洲有很多这样的名字。

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

    - & matched Camel Case letter
    

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

    我设法找到一个正则表达式,向我展示了粘贴连字符所需的位置:

    .[A-Z]{1}/ug     
    

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

    但是我该如何替换这个字符串:

    AlbertWeisgerberAllee 
    

    它变成了

    Albert-Weisgerber-Allee
    

3 个答案:

答案 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

请参阅https://regex101.com/r/qI2iA9/3

答案 2 :(得分:1)

你似乎过度复杂化了表达。您可以使用以下内容将-置于除第一个以外的任何大写字母之前:

(.)(?=[A-Z])

只需将其替换为$1-即可。基本上,这个正则表达式的作用是:

  1. (.)查找任何角色并将该角色放在第1组中。
  2. (?=[A-Z])查看后面是否包含大写字符。
  3. $1-如果匹配,请替换为第1组中的字符,后跟连字符。