2012-03-08 6 views
0

私はこのコードを使用して、HTMLソースコードと必要な情報を取得します。私は<と "!"が返ってくるかどうかだけをテストしていました。最初の行はしかし、これは動作しません!あなたはフォワードスラッシュ/と混同バックスラッシュ\をしましたので、だ<と "!"のJava正規表現1行目

import java.io.*; 
    import java.net.URL; 
    import java.util.regex.*; 

    public class url 
    { 
     public static BufferedReader read(String url) throws Exception { 
      return new BufferedReader(
       new InputStreamReader(
        new URL(url).openStream())); 
     } 

     public static void main (String[] args) throws Exception{ 
      BufferedReader reader = read(args[0]); 
      String line = reader.readLine(); 

      while(line != null) { 
       System.out.println(line); 
       line = reader.readLine(); 
       regex("//<//!",line); 
       } 
      } 

     public static void regex(String regex, String check){ 
       Pattern checkregex =Pattern.compile(regex); 
       Matcher regexMatcher = checkregex.matcher(check); 
       if(regexMatcher.find()==false) 
        return; 

       while(regexMatcher.find()){ 
        if(regexMatcher.group().length() !=0) { 
         System.out.println(regexMatcher.group().trim()); 
        } 
       }     
     }  
    } 
+1

regexMatcher.find()は一致する文字列を消費することを知っていて、if(regexMatcher.find()== false)は 'check'の 'regex' 。そして、もしcheck = "regexregex";最初の発生が消費され、System.out.printlnは2回ではなく1回だけ印刷されます。 – fiction

答えて

3

。前者は特殊文字をエスケープするためのものです。だから、これを変更します。これに

   regex("//<//!",line); 

あなただけ書くことができますので、 <!が実際にこのコンテキストで任意の特別な意味を持っていない、と述べた
   regex("\\<\\!",line); 

   regex("<!",line); 
を必要に応じて

また、上記の正規表現は、2文字のサブストリング<!と一致します。あなたの質問には、実際には1文字の部分文字列<!を別々にマッチさせたいと思うと思いますか?その場合は、複数の代替パターンを指定するための...|...構文を使用できます:

   regex("<|!",line); // matches whatever matches < or matches ! 

または文字のクラスを指定するための[...]構文:

   regex("[<!]",line); // matches a character that is either < or ! 

(この状況では、これら2つの構文があるが同等)。

+0

ありがとうございました –

+0

@ user1257428:ようこそ! – ruakh

+0

@ user1257428:あなたは私の答えを受け入れていないことがわかります。あなたはそれに問題が発生しましたか? – ruakh