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

Php 用字符本身和连字符替换字符的正则表达式,php,regex,string,Php,Regex,String,我需要将一些camelCase字符替换为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

我需要将一些camelCase字符替换为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);
现在,我有两个问题

  • 我的正则表达式很差

  • 上面的正则表达式还从街道名称中删除了所有
    -
    ,在德国和欧洲有很多这样的名称

  • 实际上,调整正则表达式使其不剪切任何连字符是很容易的,但我想了解正则表达式是如何工作的,因此我决定尝试找到一个正则表达式,它用

    - & matched Camel Case letter
    
    除了第一个大写字母外

    我找到了一个正则表达式,它显示了需要粘贴连字符的位置,如下所示:

    .[A-Z]{1}/ug     
    

    但我究竟该如何替换这根弦:

    AlbertWeisgerberAllee 
    
    变成

    Albert-Weisgerber-Allee
    

    只需使用捕获组:

    (.)([A-Z])        //removed {1} because [A-Z] implicitly matches {1}
    
    并替换为
    $1-$2


    请参见

    在caps使用此正则表达式之前插入破折号:

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

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

    (.)(?=[A-Z])
    
    只需将其替换为
    $1-
    。基本上,这个正则表达式的作用是:

  • ()
    找到任何字符并将其放入组1
  • (?=[A-Z])
    查看是否后跟大写字符
  • $1-
    如果匹配,则替换为组1中的字符,后跟连字符

  • 所以,你所需要做的就是在大写字母前加一个连字符,对吗?是的,除了第一个@Anonymous之外,不要用另一个正则表达式修复一个错误正则表达式的输出,我建议你只修复第一个正则表达式(有可能),不要替换数字前面的
    -
    s。从头重写整个正则表达式。如果您还没有这样做,请遵循(冗长的)正则表达式教程,给自己一整天或更多的时间来学习正则表达式(这次忘记您的问题)。无论何时你需要正则表达式,它都会让你的编码生活少那么令人沮丧。@hoijui完全同意,完全按照你上周刚刚推荐的那样做了。你说得很对,知道正则表达式是如何工作的值这么多…这与阿尔伯特韦斯格伯雷的说法不符。@Anonymous那不是卡梅尔凯斯的。。。所以不用担心。。这也应该变成
    Albert Wweigerber Allee
    ,这就是我的正则表达式所做的:)根据,camel case是“书写没有空格和首字母大写或小写字母的复合词或短语的约定,剩余的每个词元素都以大写字母开头”。但是,最终取决于他们打算询问的OP。:)在这种情况下,就像@karthikmanchala所说的,我一直在寻找的CamelCase就是他的regex匹配的