2016-06-22 15 views
-1

上記の2つの文字列に対して真です。マッチ文字列パターン

+0

。 –

+1

問題について詳しく教えてください。あなたは "2つの文字列を比較する" - その2つの文字列はどこから来ますか?それらのうちの1つは既知の定数ですか、あるいはどちらも入力ソースから来る可能性がありますか?両方が入力から来る場合、それらのうちの1つだけに '*'、あるいはその両方が含まれていますか? – ajb

+0

は入力から来て、両方とも '* 'を持つことができます –

答えて

3

文字列のいずれかに*が含まれている場合は、正規表現を使用できます。ただ、[PF]ですべての*を置き換える:

String s = "PPFFP"; 
if (s.matches("P[PF][PF]F[PF]") { 
    ... 
} 

両方の文字列で*を許可する複数の基本メソッドは次のようになります。

public static boolean matches(String s1, String s2) { 
    if (s1.length() != s2.length()) return false; 
    for (int i = 0; i < s1.length(); i++) { 
     if (s1.charAt(i) != '*' && 
      s2.charAt(i) != '*' && 
      s1.charAt(i) != s2.charAt(i)) { 
      return false; 
     } 
    } 
    return true; 
} 
+0

また、[FP] + "' –

+0

@MichaelMarkidis:そうは思わないでしょう。 1つの文字列内の位置にワイルドカードがない場合、その文字列のうちのどれが他の文字列にあるかは重要です。 –

+0

Gotcha。私はOPが最初に望んでいたことを完全に理解していませんでした。ありがとう。 –

1

の質問は少しあいまいです。しかし、あなたはrightは、任意の文字に一致するように*をも含むことができながらleftは、唯一のPとFが含まれている方法

public boolean matches(String left, String right) 

を作成する必要がありますと仮定しましょう。あなたは*がPまたはFのいずれかに一致するように[PF]によって置き換えられる正規表現の中に右引数を変換することによってこれを行うことができます

:Javaでは

public boolean matches(String left, String right) { 
    String regex = right.replace("*", "[PF]"); 
    return left.matches(regex); 
} 

、正規表現は単なるString値であり、それは完全に許容可能です正規表現が他の式で作成された文字列であるためです。

leftrightの両方に*が含まれる場合は、Frankの答えをご覧ください。 (注:これはあなたの状況と思われますが、私はあなたのコメントを見る前に私の答えを掲載しました))正規表現を作成することによってこれを行う "巧妙な"方法がありますが、ループアプローチ。しかし、これはうまくいくと思う:

public boolean matches(String left, String right) { 
    String regex = right.replace("*", "#") 
         .replace("P", "[P\\*]") 
         .replace("F", "[F\\*]") 
         .replace("#", "[PF\\*]"); 
    return left.matches(regex); 
} 

私はこれをテストしていない。

1

私が理解するものから、これはあなたが探しているものかもしれません:

あなたは文字クラスを正規表現を使用することができます
String input_1 = "*PF*P"; 
String input_2 = "P**F*"; 
char[] input_1_chars = input_1.toCharArray(); 
char[] input_2_chars = input_2.toCharArray(); 

if(input_1.length() != input_2.length()){ // If two strings are not equal 
    System.out.println("FALSE"); 
} 
else{ 
    for(int i=0;i<input_2.length();i++){ 
     if(input_2.charAt(i) == '*'){ 
      input_1_chars[i]='*'; // Copy asterisk from input 2 to indices of input 1. 
     } 
    } 
    for(int i=0;i<input_1.length();i++){ 
     if(input_1.charAt(i) == '*'){ 
      input_2_chars[i]='*'; // Copy asterisk from input 1 to indices of input 2. 
     } 
    } 

    input_1 = String.valueOf(input_1_chars);// Convert char array back to string. 
    input_2 = String.valueOf(input_2_chars); 
    if(input_1.equals(input_2)){ 
     System.out.println("TRUE");// If strings are equal then print True 
    } 
    else{ 
     System.out.println("FALSE");//else false 
    } 
} 

INPUT: OUTPUT: PPF*P TRUE P**F*

INPUT: OUTPUT: PPFPP FALSE P**F*

+0

このように見えますが、長さが等しくないと分かった場合は、本当に終了する必要があります。あなたがそれを書いたやり方では、それはFALSEを出力し、次に続行しようとし、最終的に例外をスローします。また、OPが両方の文字列に '*'を含むことができるようになったので、両方の文字列がchar配列に変換され、両方の配列の文字が必要に応じて '*'に設定されるように修正する必要があると思います。 Frankのソリューションはより効率的だと思いますが、これは同様の問題を解決するのに役立つ方法です。また、「アスタリスク」のスペルミスもあります。 – ajb

+0

さて、私がOPから理解したのは、2番目の文字列にアスタリスクしか含まれていないことです。とにかく新しいコードが更新されます。それを指摘していただきありがとうございます。 –

関連する問題