php
  • regex
  • preg-replace
  • 2016-01-02 129 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) –

    相關問題