1

正規表現のパターンが一致していない列番号と行番号を印刷するにはどうすればよいですか。

私の現在のコード:

 reader = new BufferedReader(new FileReader(credentialPath));

 Pattern pattern = Pattern
                .compile(ApplicationLiterals.CREDENTIALS_URL_REG_EX);
 String line;
 while ((line = reader.readLine()) != null) {
      Matcher matcher = pattern.matcher(line.trim());
      if (matcher.find()) {
            // System.out.println(matcher.group());
            // System.out.println("**" + matcher.start());
            // System.out.println("***" + matcher.end());
            result = true;
            count1++;
       } else {
            // count1++;
            result = false;
            // System.out.println(matcher.group());
            // System.out.println(matcher.start());
            System.out.println("****problem at line number" + count1);
            break;
       }
  }
4

2 に答える 2

0

を取得している理由IllegalStateExceptionmatcher.group()またはmatcher.start()です。

コントロールがelseブロックに移動した場合、 が とline一致しないことを意味することは明らかPatternです。一致するものが見つからない場合、その一致のstartまたはを出力するにはどうすればよいでしょうgroupか?

例外スタック トレースには、次のように明確に示されます。- No match found

ドキュメントが表示された場合:-

例外: IllegalStateException - 一致がまだ試行されていない場合、または前回の一致操作が失敗した場合

あなたの場合も、試合が失敗したため、IllegalStateException.

既に行ったように、matcher.group()&matcher.start()をコメントしたままにして、 のコメントを外しcount1++count1. 行番号を教えてくれます。

アップデート:-

これをあなたのelseブロックとして持ってください。

else {
    count1++;
    result = false;
    System.out.println("**This line doesn't match the pattern*** "+line);
    System.out.println("****problem at line number" + count1);
    break;
}
于 2013-04-04T10:28:06.830 に答える
0

一致しないパターンを表示したい場合は、2 つのことができます。

1. 正規表現の反対のパターンを作成し、else ブロックでそれを照合して正確な単語を表示します。たとえば、次のような正規表現がある場合[aeiou]*、反対は になります[^aeiou]*

2.matcher.start() and matcher.end()同じ変数を保持し、elseブロックでそれらの変数を使用して、一致しない行の残りの部分を見つけます。あなたの最後の20で、ループの次の反復でelseブロックになると仮定します。これは、20の後に一致しないものがあることを意味するため、20の後の行の内容を表示します.

編集:

フロー コードを活用する

public static void main(String[] args) {
    String source = "Java is best \n Test Java is good \n  Java Hello";
    Pattern pattern = Pattern.compile("Java");
    Matcher matcher = null;
    Scanner scanner = new Scanner(source);
    String line = null;
    int end = 0;
    int lineNumber = 0;
    while (scanner.hasNextLine()) {
        line = scanner.nextLine();
        matcher = pattern.matcher(line);
        ++lineNumber;
        while (matcher.find()) {
            System.out.println(matcher.group());
            end = matcher.end();
        }
        if (end < line.length() - 1) {
            System.out.println("NOt matched Line :" + lineNumber + " Words:-"
                    + line.substring(end));
        }
    }
}
于 2013-04-04T12:48:42.893 に答える