2016-11-01 26 views
1

私の正規表現に問題があります。私は、ArrayListの外のすべての私の正規表現を取得し、それをコンパイルし、一致を検索するには、次のコードを使用:ファイルからの文字列読み込みと文字列リテラルの比較

public boolean match(String command){ 
    for (String regex : regexA) { 
     System.out.println(regex); 
     Pattern regPatter = Pattern.compile(regex); 
     Matcher regMatcher = regPatter.matcher(command); 

     if(regMatcher.find()) 
      return true; 
    } 

    return false;  
} 

私はそのようにそれをテスト:

public static void main(String[] args){ 
    RegexMatcher reg = new RegexMatcher(new File("C:\\Users\\XXX\\Desktop\\regex.txt")); 
    System.out.println(reg.match("password cisco")); 
} 

それは次のように返します。

pas[a-z]\\s*\\w+ 
er\\w*\\s+(?!s).* 
us[a-z]*\\s+((?!cisco).)*$ 
tr[a-z]*\\s+i[a-z]*\\s+\\w*\\s* 
f[a-z]*\\s+f.*\\s* 
en[a-z]*\\s+v.* 
false 

falseを返します。しかし、私はそれは違うそれが動作するように行う場合:

public boolean match(String command){ 
    Pattern regPatter = Pattern.compile("pas[a-z]\\s*\\w+"); 
    Matcher regMatcher = regPatter.matcher(command); 

    if(regMatcher.find()) 
     return true; 

    return false; 
} 

だから私の問題は、私はPattern.compile()に直接文字列を入力した場合、それは動作しますが、私は私のmatch()方法で好きならば、それは動作しません。

+1

です"RegexMatcherの違いは" Java正規表現の問題 "ではなくPattern.compile()です。これは他の人があなたの質問と答えを見つけるのに似た問題を持つのに役立ちます。 –

+0

次回はお知らせします。情報ありがとうございます。 :) – KingAnjrey

+1

あなたはまだそれを変更することがあります、私は思う... –

答えて

0

あなたのregex.txtファイルには、単一のバックスラッシュ "\"が含まれていて、二重ではありません。それは次のようになります。Java文字列で

pas[a-z]\s*\w+ 
er\w*\s+(?!s).* 
us[a-z]*\s+((?!cisco).)*$ 
tr[a-z]*\s+i[a-z]*\s+\w*\s* 
f[a-z]*\s+f.*\s* 
en[a-z]*\s+v.* 

、バックスラッシュは特殊文字を「エスケープ」するために使用されている - など。 "\ n"は、改行文字を1つだけ含む文字列になり、 "\"の後に "n"を付けません。

同様に、ダブルバックスラッシュ「\」は、単一のバックスラッシュを含む文字列になります。それが正規表現のために必要なものです。

ファイルはエスケープする必要はありません(改行などは既にエンコードされています)ので、バックスラッシュをエスケープする必要はありません。そのため、単一のものだけが必要です。私はこのようにコードを変更したときにそれが正常に動作しているregex.txt

+0

あなたの助けに感謝@racraman。このような単純なエラーでした。 – KingAnjrey

+1

喜んで助けてください;あなたは何時間もナッツを動かすことができる簡単なものです! :) – racraman

+0

真実:@racraman。 – KingAnjrey

0

文字列リテラルでは、バックスラッシュをエスケープする必要があります。つまり、\fooという文字列は、Javaソースコードの文字列リテラルとして記述すると、"\\foo"と記述する必要があります。

2番目の例では、リテラル文字列"pas[a-z]\\s*\\w+"を使用しています。実際には実際の文字列pas[a-z]\s*\w+"に対応しています。しかし、リスト内の文字列はその文字列ではなく、pas[a-z]\\s*\\w+です。

0

あなたのファイルを共有することができます。

public boolean match(String command){ 
    String regexA[] = new String[] { "pas[a-z]\\s*\\w+", 
            "er\\w*\\s+(?!s).*", 
            "us[a-z]*\\s+((?!cisco).)*$", 
            "tr[a-z]*\\s+i[a-z]*\\s+\\w*\\s*", 
            "f[a-z]*\\s+f.*\\s*", 
            "en[a-z]*\\s+v.*" }; 
    for (String regex : regexA) { 
     System.out.println(regex); 
     Pattern regPatter = Pattern.compile(regex); 
     Matcher regMatcher = regPatter.matcher(command); 

     if(regMatcher.find()) 
      return true; 
    } 

    return false;   
} 
0

は非常に単純であるためには、ファイルから読み込んだ正規表現は、Java文字列に正規表現とは異なるエスケープされます。たとえば、あなたが例えば、あなたの質問のためのより正確なタイトルを指定することができればそれは素晴らしいことだ、正しい文字列が"\\w"ですが、ファイル内の正しい行が

\w 
関連する問題