2016-04-24 84 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

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