gpt4 book ai didi

完整字符串正则表达式的Java字符串分析

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:32:05 28 4
gpt4 key购买 nike

我正在寻找一种类似 Java 字符串分析 (JSA) 的工具,它可以将字符串总结为正则表达式。我曾尝试使用 JSA 来做到这一点,但我需要搜索特定的方法,如 StringBuffer.append 或其他字符串操作。

我有这样的字符串:

        StringBuilder test=new StringBuilder("hello ");
boolean codition=false;
if(codition){
test.append("world");
}
else{
test.append("other world");
}
test.append(" so far");
for(int i=0;i<args.length;i++){
test.append(" again hello");
}

// regularExpression = "hello (world| other world) so far( again hello)*"

到目前为止,我的 JSA 实现看起来像这样:

    public static void main(String[] args) {
StringAnalysis.addDirectoryToClassPath("bootstrap.jar");

StringAnalysis.loadClass("org.apache.catalina.loader.Extension");
List<ValueBox> list = StringAnalysis.getArgumentExpressions("<java.lang.StringBuffer: java.lang.StringBuffer append(java.lang.String)>", 0);

StringAnalysis sa = new StringAnalysis(list);
for (ValueBox e : list) {
Automaton a = sa.getAutomaton(e);
if (a.isFinite()) {
Iterator<String> si = a.getFiniteStrings().iterator();
StringBuilder sb = new StringBuilder();
while (si.hasNext()) {
sb.append((String) si.next());
}
System.out.println(sb.toString());
} else if (a.complement().isEmpty()) {
System.out.println(e.getValue());
} else {
System.out.println("common prefix:" + a.getCommonPrefix());
}
}

}

对于 JSA 工具的任何帮助或对其他工具的提示,我将不胜感激。正则表达式的最大问题是围绕字符串常量的控制流结构。

最佳答案

我不知道有什么工具可以立即生成正则表达式。

但由于您对 CFG 有疑问,我建议您针对您的问题编写静态分析。您可以使用像 OPAL 这样的静态分析/字节码框架。 (Scala) 或 Soot ( java )。您将在每个项目页面上找到教程。

设置完成后,您可以加载目标 jar。您应该能够像下面的示例一样利用程序的控制流:

1 public static void example(String unknown) {
2 String source = "hello";
3 if(Math.random() * 20 > 5){
4 source += "world";
5 } else {
6 source += "unknown";
7 }
8 source += unknown;
}

如果您的分析发现一个已初始化的 String 或 StringBuilder,您就可以开始构建您的正则表达式。例如,第二行会让你的正则表达式变成“你好”。如果您在程序的控制流中遇到条件,您可以分析每条路径并通过“|”将它们组合起来稍后的。

然后分支:“world”(第 4 行)
其他分支:“未知”(第 6 行)

这可以在 (world)|(unknown) 的第 7 行进行总结,并附加到条件表达式之前的正则表达式中。

如果您遇到一个变量,您可以通过过程间分析追溯它,否则您必须使用通配符“.*”。

最终的正则表达式:“你好((世界)|(未知))。*”

我希望这能引导您找到想要实现的解决方案。

关于完整字符串正则表达式的Java字符串分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32326014/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com