Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pattern.compile帮助java程序_Java_Text Parsing_Matcher - Fatal编程技术网

pattern.compile帮助java程序

pattern.compile帮助java程序,java,text-parsing,matcher,Java,Text Parsing,Matcher,我编写了一个程序来解析一个文本文件,其中包含一个带有if、else和while条件的示例C程序 我有2个ArrayLists,我的程序将解析整个文件。我正在使用Matcher并在pattern.compile()中指定了模式Strings。我试图为一个特定的程序绘制一个控制流图;但是,我现在只查找节点,稍后将链接它们 这是我的密码: //import static LineMatcher.ENCODING; import java.io.BufferedReader; import java.i

我编写了一个程序来解析一个文本文件,其中包含一个带有
if
else
while
条件的示例C程序

我有2个
ArrayList
s,我的程序将解析整个文件。我正在使用
Matcher
并在
pattern.compile()中指定了模式
String
s。我试图为一个特定的程序绘制一个控制流图;但是,我现在只查找节点,稍后将链接它们

这是我的密码:

//import static LineMatcher.ENCODING;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class CFG {

  public void findLines(String aFileName) {
    List<Integer> a = new ArrayList<Integer>();
    List<Integer> b = new ArrayList<Integer>();
    // int [] a = new int[10000];
    // int [] b = new int[10000];
    Pattern regexp = Pattern.compile("if|else|while");
    Matcher exp1 = regexp.matcher("if");
    Matcher exp2 = regexp.matcher("else");
    Matcher exp3 = regexp.matcher("while");

    Path path = Paths.get(aFileName);
    try (BufferedReader reader = Files.newBufferedReader(path, ENCODING);
        LineNumberReader lineReader = new LineNumberReader(reader);) {
      String line = null;
      while ((line = lineReader.readLine()) != null) {
        // exp1.reset(line); //reset the input
        int counter = 1;
        if (exp1.find()) {
          int l = lineReader.getLineNumber();

          b.add(l);
        }
        if (exp2.find()) {
          int l = lineReader.getLineNumber();

          b.add(l);
        }
        if (exp3.find()) {
          int l = lineReader.getLineNumber();

          b.add(l);
        } else {
          int l = lineReader.getLineNumber();
          a.add(l);
        }
      }
      // counter++;

      System.out.println(a);
      System.out.println(b);
    }

    catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  final static Charset ENCODING = StandardCharsets.UTF_8;

  public static void main(String... arguments) {
    CFG lineMatcher = new CFG();
    lineMatcher.findLines("C:Desktop\\test.txt");
  }
}
程序的输出为:

run: 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
[1, 1, 1]
PS:我是个业余爱好者,这个程序在逻辑上可能不正确

如果需要更多信息,请告诉我

编辑:

仅适用于一个字符串搜索的代码:

Pattern regexp = Pattern.compile("if");
    Matcher matcher = regexp.matcher("if");


    Path path = Paths.get(aFileName);
    try (
      BufferedReader reader = Files.newBufferedReader(path, ENCODING);
      LineNumberReader lineReader = new LineNumberReader(reader);
    ){
      String line = null;
      while ((line = lineReader.readLine()) != null) {
       matcher.reset(line); //reset the input


       if(matcher.find())
       {

         int a= lineReader.getLineNumber();
         System.out.println(a);
                }

      }      
    }    
    catch (IOException ex){
      ex.printStackTrace();
    }

上面的一个工作正常(它只是代码的一部分,而不是整个程序。程序与上面的一个相同),如果找到
,则返回行号。我使用了相同的逻辑并添加了
else和while部分。

听起来你好像在试图识别和使用另一种语言的语法。一段时间前我尝试过这样做,但最终删除了我的自定义代码,并决定改用ANTLR API。这确实缩短了我完成项目所需的时间。如果可以的话,我建议你走那条路线


这是ANTLR站点:

当您尝试匹配“if”时,您正在进行模式匹配,这意味着整个行等于“if”,我认为您需要做的是“.if”。它将查看该行是否包含“if”。既然如此,请使用字符串的.contains()方法来查找各种语句,而不是使用正则表达式。它的效率更高。

最后,我实现了这一点(感谢您的惊人投入)。以下是我所做的更改:

public void findLines(String aFileName) {

     List<Integer> a = new ArrayList<Integer>();
     List<Integer> b = new ArrayList<Integer>();

    Pattern regexp = Pattern.compile("(if|else|while).*");
    Matcher exp1 = regexp.matcher("if|else|while");
    Path path = Paths.get(aFileName);
        try (
          BufferedReader reader = Files.newBufferedReader(path, ENCODING);
          LineNumberReader lineReader = new LineNumberReader(reader);
        ){
          String line = null;
          while ((line = lineReader.readLine()) != null) {
          exp1.reset(line); 


            if(exp1.find())
            {
                int l= lineReader.getLineNumber();


                b.add(l);

                     }

            else
            {int l= lineReader.getLineNumber();
                  a.add(l);


               }   

          } 


        System.out.println(a);
        System.out.println(b);
                }


       catch (IOException ex){
         ex.printStackTrace();
        }

您使用的
Regex
错误。我知道您想要解析一行的内容,但是在您的代码中,该行和正则表达式之间没有连接。您要做的是始终测试相同的字符串(“if”、“else”、“while”)。您需要为每一行创建
Matcher
,比如
regexp.Matcher(line)
@lpiepiora是正确的,但是您还需要更改regex。最简单的工作方式是
*(if | else | while)。*
。但是,如果该行包含名为运算符(diff,…)的变量,则这将导致错误的结果。您有一个
模式,它定义了您要查找的内容。想象一个简单的regexp
Regex(TheUnknown)
,它正好匹配您的用户名。
regexp.matcher(input)
是该定义在输入上的应用,产生了一个
matcher
。如果你通过不同的参数。到
matcher()
您将获得另一个对该其他输入有效的
matcher
实例。考虑到我们之前讨论过的regexp,如果我调用
regexp.matcher(“未知”)
您将得到一个
matcher
实例,它匹配它的输入,但是如果我传递
regexp.matcher(“lpiepiora”)
它将不匹配。构造一个更简单的示例,并尝试使用
find
方法,您可以使用regex
if | else | while
。对于
matcher
方法,您可以使用我的方法。但是坚持使用
find
方法,它更清晰。请记住,对于更复杂的源代码,您必须调优regex<代码>字符串imgName=“x.gif”->如果
,这也将被视为
。但从一开始,你的正则表达式就足够了。这个问题似乎离题了,因为它是关于代码审查的,应该在codereview.stackexchange.com上有一个链接,可以找到你的第一个答案,请尝试将此部分包含在其中,然后删除此部分:)谢谢。我已经添加了解决方案。它在问题本身,在最后。另外,
.if.
将不起作用,如果有一个包含
if
的打印语句,那么该怎么办?因此,我使用
if.
查看语句的开头是否是
if
public void findLines(String aFileName) {

     List<Integer> a = new ArrayList<Integer>();
     List<Integer> b = new ArrayList<Integer>();

    Pattern regexp = Pattern.compile("(if|else|while).*");
    Matcher exp1 = regexp.matcher("if|else|while");
    Path path = Paths.get(aFileName);
        try (
          BufferedReader reader = Files.newBufferedReader(path, ENCODING);
          LineNumberReader lineReader = new LineNumberReader(reader);
        ){
          String line = null;
          while ((line = lineReader.readLine()) != null) {
          exp1.reset(line); 


            if(exp1.find())
            {
                int l= lineReader.getLineNumber();


                b.add(l);

                     }

            else
            {int l= lineReader.getLineNumber();
                  a.add(l);


               }   

          } 


        System.out.println(a);
        System.out.println(b);
                }


       catch (IOException ex){
         ex.printStackTrace();
        }
[1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13]
[5, 9]