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

标签 java regex string

我正在寻找一种类似 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/

相关文章:

java - 升级到 spring 5.0.7.RELEASE 导致 parseStringValue 出现问题

Java Gridgain 应用程序在压力测试 1 天后开始失败

匹配两个字符串的Javascript正则表达式

c++ - 为什么 cin 在包含字符串头后接受字符串输入

java - 检查中间字符串是否以某种模式开始和结束并更新该字符串

c++ - 如何将双引号放入字符串文字中?

java - 即使尝试从 JVM 静态初始化过程获取相同的锁,线程也不会停止

java - 由于 "unknown resource",无法通过 keycloak-admin-client 将用户添加到 Keycloak

.net - 使用正则表达式将字符串映射到功能

regex - 正则表达式允许单词之间有空格