php
  • regex
  • preg-replace
  • 2016-01-02 54 views 1 likes 
    1

    我有,像这样的字符串:PHP - 的preg_replace不匹配之外的字符匹配的字符串

    // example 
    $str1 = "  10.503 GB 3.4 GiB "; 
    $str2 = " 40.29 KiB "; 
    $str3 = "14.3 GB 2.1 51 "; 
    

    这里是我的正则表达式,匹配字符串其中“10.503 GB”,“3.4吉布”,“40.29昆明植物”和分别

    $regex = '/(\d+\.\d+ [A-Za-z]+[^\s])/'; 
    preg_match_all($regex, $str1, $out1); 
    preg_match_all($regex, $str2, $out2); 
    preg_match_all($regex, $str3, $out3); 
    

    “14.3 GB”所以,问题是,我怎么能更换不匹配的与用户自定义字符我的正则表达式匹配非字符?示例如下:

    $char = 'A'; // assume this is user input 
    $str1 = "  10.503 GB 3.4 GiB "; 
    $str2 = " 40.29 KiB "; 
    $str3 = "14.3 GB 2.1 51 "; 
    
    /* preg_replace (or another preg_* magic here */ 
    

    所以最后一个字符串将

    $str1 = "AAAAA10.503 GBAA3.4 GiBAAA"; 
    $str2 = "AA40.29 KiBAAAA"; 
    $str3 = "14.3 GBAAAAAAAAAAAAA"; 
    

    我知道在不使用的preg_replace的解决方案,而只是假装的preg_replace是需要在这里(或其他参看preg_ *如果你喜欢)

    所以这可能吗?如果是这样,我该怎么做到这一点?

    +1

    如果不是PHP,您还需要支持哪种引擎?我想这个问题是回答。只有Boost可以通过条件替换模式正确地完成这项工作,其他人将产生非精确的输出(在每次不匹配后有一个额外的'A')。看看另一个[PHP正则表达式演示](https://regex101.com/r/dO5aX0/2)。 –

    +0

    @Casimir et Hippolyte给了我的问题一个完美的答案:)也感谢stribizhev的信息! –

    回答

    1

    喜欢的东西:

    ~\d+\.\d+ [a-zA-Z]+\b(*SKIP)(*F)|.~ 
    

    与A作为替代。当模式失败后

    demo

    (*SKIP)力量不重试先前匹配的位置。 (*F)(*FAIL)强制该模式失败。

    注意,办理值没有小数,你应该\d+(?:\.\d+)?


    取代\d+\.\d+如果不使用正则表达式引擎与这些回溯控制谓词(仅适用于Perl中,语言使用PCRE,或新的Python正则表达式模块),就可以实现与捕获组和反向引用相同:

    pattern: ((?:\d+(?:\.\d+)? [a-zA-Z]+\b)*). 
    replacement: \1A 
    or: $1A 
    

    有了PCRE,Perl和Python的正则表达式模块和红宝石2,你也可以这样做:

    pattern: (?:\d+(?:\.\d+)? [a-zA-Z]+\b)*\K. 
    replacement: A 
    
    +0

    哇!当我看到(* SKIP)和(* FAIL)时,我完全惊讶!但在我的进一步阅读中,这只适用于PHP依赖的PCRE引擎,但是如何在不依赖此功能的情况下完成此操作? (例如使用另一个正则表达式引擎)*对不起,在这里提出另一个问题* –

    +1

    @MohdShahril:我添加了一种没有回溯控制动词的方式,但请记住*普通正则表达式模式*不存在,每种语言可能有自己的正则表达式引擎,实现和语法。 –

    +0

    我明白了,但是您的一般正则表达式解决方案在A之间有空隙,这是不可避免的? [regex101演示](https://regex101.com/r/cA6iQ3/2) –

    相关问题