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

你得到 a 的原因IllegalStateExceptionmatcher.group()or matcher.start()

很明显,如果控件进入else块,则意味着line不匹配Pattern. 当没有找到匹配项时,如何尝试打印匹配项的 thestart或 the 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

如果您想显示不匹配的模式,那么您可以做两件事。

1.创建正则表达式的相反模式,并在 else 块中匹配它并显示确切的单词。例如,如果你有一个像[aeiou]*then 相反的正则表达式[^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 回答