2017-10-11 27 views
-1
String[] operatorList = { "name", "first_name", "last_name", "city" }; 
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don"; 
for (String opElement : operatorList) { 
    if (originalString.contains(opElement)) { 
     String tempStr = originalString.replace(opElement, "user." + opElement); 
     originalString = tempStr; 
    } 
} 
System.out.println("originalString " + originalString); 

出力:Javaで文字列から単語を置き換え

user.city =ヒューストン^ ORlast_user.name = Cervantsz^ORfirst_user.name =ジョン^ user.name =ドン

とき私は名前を "user.name"と置き換えようとしています。 "last_name"の名前は "last_user.name"に、first_nameはfirst_user.nameに置き換えようとしています。

しかし、 "name"を "user.name "と" last_name "を" use " r.last_name " 、" first_name "に" user.first_name "と入力します。

助けてください。

+1

これは既知の問題です。 '' name'の代わりに ''(?<!first_)(?<!last_)name "のような正規表現を使うか、単語境界を持つ正規表現ベースの正規表現を作って正規表現を使用してリストを作成し、置き換えます。 –

+1

私の意見では間違っています。ステップ1 - ラインを鍵のペアに分割します。ステップ2 - ループの鍵ペア。ステップ3 - keyapirsをkeyとvalueに分割します。ステップ4 - のキーの交換は、1つ1つ後ろにキーペアです。 5 - 結果を文字列に戻します。ステップ6 - 利益 – degr

+0

あなたのコードの使い方によっては、単純に '(^ | \ ^(?: OR)?)(\ w *?name \ w *?)(?==)'を使用し、 '$ 1user。$ 2' – ctwheels

答えて

1

プレフィックスallキーを追加して、そのキーを制御できます。例

String[] operatorList = {"name", "first_name", "last_name", "city"}; 
    String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^ORname=don"; 
    for (String opElement : operatorList) { 
     if (originalString.contains("^OR"+opElement)) { 
      String tempStr = originalString.replace(opElement, "user." + opElement); 
      originalString = tempStr; 
     } 
    } 
    System.out.println("originalString " + originalString); 
+1

これは動作しません。あなたのコードに '^ ORname = don'を追加しました。元のものは '^ name = don'(見つからなかった' OR'に気付く)でした。 「都市」には「OR」もありません。 – BackSlash

0

変更しようとしている値は常に(それらが同じ順序で常にある意味)ユニークで生成されている場合は、単純に同じ順序であなたの演算子を入れて、代わりにreplaceLast()を使用することができます。

さらに完全な解決策は、文字列の構成方法を決定することです。すべての値の前に^がありますか?同じ値に対してORが生成されているか、またはオプションの値を示していますか?最終的には、文字列を適切に分割することができます。次に、正規表現を使用して周囲の文字を使用することができます。

スプリッタが定数(すべて "^ OR"が "@@%!!"になり、残りの "^"が "%!!"になるように)文字列をフォーマットします。 !

String[] operatorList = { "name", "first_name", "last_name", "city" }; 
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don"; 

originalString = originalString.replaceAll("\\^OR", "@@%!!"); 
originalString = originalString.replaceAll("\\^", "%!!"); 
    //the order is important here 

for (String opElement : operatorList) { 
    if (originalString.startsWith(opElement)) { 
     originalString = originalString.replaceFirst(opElement, "user." + opElement); 
    } 

    originalString = originalString.replaceAll("!!" + opElement, "user." + opElement); 
     // no need for an other alternative here because replaceAll returns the 
     // String as is if it does not find the first parameter in the String. 
} 

originalString = originalString.replaceAll("@@%", "^OR"); 
originalString = originalString.replaceAll("%", "^"); 
    // the order here is also important 

出力:その後、私は残りの「@@%」または「%」を使用して元の形式に文字列を再フォーマットします「ユーザーは」すべての鍵ペアは、接頭辞が必要な場合"user.city=Houston^ORuser.last_name=Cervantsz^ORuser.first_name=John^user.name=don"

0

を、私は希望します分割するには元の文字列が最初です。

Java8

String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don"; 
String[] params = originalString.split("\\^"); 

String result = String.join("^", Arrays.stream(params) 
    .map(param -> param.startsWith("OR") ? "ORuser." + param.substring(2) : "user." + param) 
    .collect(Collectors.toList())); 

System.out.println(result); 

では、ループタイプのために変更することができます。

0

あなたはクイック検索を使用し、それらがワード境界または^ + OR/ANDの/ etcに先行しているだけで、検索ワードから動的に作成さ交互に基づくパターンで置き換えることができます。単語の境界が続いています。このソリューションは、検索語が唯一の単語文字(文字、数字または_)から構成を前提としていることに注意してください:

String[] operatorList = { "name", "first_name", "last_name", "city" }; 
// assuming operators only consist of word chars 
String pat = "(\\b|\\^(?:OR|AND)?)(" + String.join("|", operatorList) + ")\\b"; 
String originalString = "city=Houston^ORlast_name=Cervantsz^ORfirst_name=John^name=don"; 
originalString = originalString.replaceAll(pat, "$1user.$2"); 
System.out.println(originalString); 
// => user.city=Houston^ORuser.last_name=Cervantsz^ORuser.first_name=John^user.name=don 

正規表現は

(\b|\^(?:OR|AND)?)(name|first_name|last_name|city)\b 

のようになります。Java demo online

regex demoを見ます。

詳細

  • (\b|\^(?:OR|AND)?) - グループ1:単語境界\bまたは^シンボルとオプションのストリング、ORまたはAND(あなたが|後、ここでより多くを追加すること)
  • (name|first_name|last_name|city) - グループ2 :検索語のいずれか
  • \b - 末尾の単語の境界。

置換パターンのグループ1の内容が挿入され、$2はグループ2の内容と同じです。

関連する問題