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,…)的变量,则这将导致错误的结果。您有一个模式,它定义了您要查找的内容。想象一个简单的regexpRegex(TheUnknown)
,它正好匹配您的用户名。regexp.matcher(input)
是该定义在输入上的应用,产生了一个matcher
。如果你通过不同的参数。到matcher()
您将获得另一个对该其他输入有效的matcher
实例。考虑到我们之前讨论过的regexp,如果我调用regexp.matcher(“未知”)
您将得到一个matcher
实例,它匹配它的输入,但是如果我传递regexp.matcher(“lpiepiora”)
它将不匹配。构造一个更简单的示例,并尝试使用find
方法,您可以使用regexif | 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]