2016-04-24 63 views
0

代碼:匹配回顧後/提前多次

public static void main(String[] args) { 
    String mainTag = "HI"; 
    String replaceTag = "667"; 
    String text = "92<HI=/><z==//HIb><cHIhi> "; 
    System.out.println(strFormatted(mainTag, replaceTag, text)); 

    mainTag = "aBc"; 
    replaceTag = "923"; 
    text = "<dont replacethis>abcabc<abcabcde>"; 
    System.out.println(strFormatted(mainTag, replaceTag, text)); 
} 

private static String strFormatted(String mainTag, String replaceTag, String text) { 
    return text.replaceAll("(?i)(?<=<)" + mainTag + "(?=.*>)", replaceTag); 
} 

所以,我想更換mainTag(變量)的replaceTag(可變)只有內標籤(<...>)。

在上面我想在裏面<...>667所有出現更換mainTag HI(不區分大小寫)的例子,但我的代碼只替換第一次出現。

實例:

92<HI=/><z==//HIb><cHIhi> 

預期輸出:

92<667=/><z==//667b><c667667> 

(mainTag = 「HI」,replaceTag = 「667」)

<dont replacethis>abcabc<abcabcde> 

預期輸出:

<dont replacethis>abcabc<923923de> 

(mainTag =「aBc」,replaceTag =「923」);

注:我的代碼是錯誤的,不僅是因爲他只替換1次,而且還因爲它只有在「mainTag」成功的「<」,換句話說工作時,回顧後只適用於一個獨特的情況。

+0

嘗試使用代碼格式(行首的四個空格或反斜槓中的代碼包裝,即'')發佈。額外的\ \使這無法理解。 –

+0

您希望從'HIb'更改爲'667b',但不會將'hi'從'replacethis'更改爲'replacet667s'。 – rock321987

+0

@ rock321987我添加了更多代碼和信息。 – developer033

回答

3

你只需要在這裏看看。這個想法是找到所有mainTags,後面跟着一個>,然後匹配<>對,並用replaceTag替換。下面的正則表達式將工作:

text.replaceAll("(?i)" + mainTag + "(?=[^<>]*>(?:[^<>]*<[^<>]*>)*[^<>]*)$", replaceTag); 

說明:

(?i)    # Ignore Case 
mainTag   # Match mainTag 
(?=    # which is followed by 
    [^<>]*   # Some 0 or more characters which are not <or> 
    >    # Close the bracket (this ensures, mainTag is between closing bracket 
    (?:   # Start a group (to match pair of bracket) 
     [^<>]*  # non-bracket characters 
     <   # Start a bracket 
     [^<>]*  # non-bracket characters 
     >   # End the bracket 
    )*    # Match the pair 0 or more times. 
    [^<>]*   # Non-bracket characters 0 or more times. 
) 
[^<>]*)$ 

上述正則表達式真的假定括號總是平衡的。對於不平衡的正則表達式,這可能會產生意想不到的結果。但是,然後正則表達式並不是真正的工具。

否則正則表達式的簡單,因爲這也將很好地工作:

"(?i)" + mainTag + "(?=[^<>]*>)" 

是取決於你的用例。這並不擔心平衡括號。你可以先嚐試第二個,如果它符合所有情況,那麼這是最好的。

+0

感謝您的回答,但第二個例子中它取代了第一個('abcabc'),但正如我所說的,它只能在標籤< >內部進行替換。 – developer033

+0

@ developer033是的,我更新了正則表達式。有些東西不見了。它現在應該工作 –

+1

我只是建議'(?= [^ <>] *>)'的前瞻。我不明白爲什麼需要休息,尤其是因爲它都是可選的。 –