2016-04-24 1 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); 
} 

は、私がreplaceTagためmainTag(変数)(変数)のみ内部タグ(<...>)を交換したいです。私は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

コードの書式設定(行の先頭に4つのスペースを入れたり、コードをバッククォートでラップする、つまり ')を使用して投稿してください。余分なものはこれを理解できないものにします。 –

+0

'HIb'から' 667b'に変更することをお勧めしますが、 'replacethis'から' replacet667s'に 'hi'を変更することはできません。 – 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 + "(?=[^<>]*>)" 

あなたのユースケースに依存しています。これはバランスのとれた括弧については心配しません。すべてのシナリオに合っていれば、最初に2番目のシナリオを試すことができます。

+0

お返事いただきありがとうございますが、2番目の例では最初の( 'abcabc')を置き換えていますが、私が言ったように、タグ< >の中だけを置き換える必要があります。 – developer033

+0

@developer033ええ、私は正規表現を更新しました。何かが欠けていた。今すぐ動作するはずです –

+1

先読みのために '(?= [^ <>] *>)'を提案するつもりでした。私は残りの部分がなぜ必要なのか分からない。なぜなら、それはすべてオプションだからである。 –

関連する問題