匹配多次看后面/前进

时间:2016-04-24 05:06:47

标签: java regex lookahead lookbehind

代码:

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(变量)标记内部(<...>)。

在上面的示例中,我想用HI替换所有出现里面 <...>的mainTag 667(不区分大小写),但我的代码只替换第一次出现。

示例:

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

预期产出:

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

(mainTag =&#34; HI&#34 ;, replaceTag =&#34; 667&#34;)

<dont replacethis>abcabc<abcabcde>

预期产出:

<dont replacethis>abcabc<923923de>

(mainTag =&#34; aBc&#34;,replaceTag =&#34; 923&#34;);

注意:我的代码错了,不仅因为他只替换了一次,而且因为它仅在&#34; mainTag&#34;取而代之的是&#34;&lt;&#34;换句话说,lookbehind仅适用于独特的情况。

1 个答案:

答案 0 :(得分: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 + "(?=[^<>]*>)"

取决于您的用例。这并不担心平衡括号。您可以先尝试第二个,如果它适合所有情况,那么它是最好的。