对正则不太熟,现在需要实现如下描述功能;
function saveData(){
     var sid="10001";
     save();
}
现要求save()函数后不能存在有效代码,例如
function saveData(){
     var sid="10001";
     save();
     alert("save");//保存后的提示
}
不能存在alert("save");但可以存在注释“保存后的提示”;
请熟悉正则的朋友给个思路,用其他方法实现也行,谢谢!!

解决方案 »

  1.   

    那再简单点,save()后面只能存在注释,其他的代码不管是否有效都不能存在
      

  2.   

    如果只针对你这个具体案例, 你就判断,save();之后 要么是空白符+},要么是空白符+注释+空白符+} 就行了
      

  3.   

    可以换个思路 在save后 加/* +原有代码+ */这样就把所有的有效加注释代码 给注释掉了
      

  4.   

    注释还要分行注释、块注释、多个注释、空几行注释,等等,还是很麻烦的。
    楼主就规定save();后只能是空白符与},这样简单些。
    如下:
    String source = "function saveData(){\n  var sid=\"10001\";\n  save(); \n \n}";
    String reg = "(?s).*save\\(\\);(?=[\\s]*[}]).*";  // save();后只允许}结束,允许夹杂空白字符和换行符
    System.out.println(source.matches(reg));
    source = "function saveData(){\n  var sid=\"10001\";\n  save(); \n//sample \n}";
    System.out.println(source.matches(reg));
      

  5.   

    最好的做法还是自己做语法解析,逐行扫描判断
    因为注释,空白的情况太多,正则不一定考虑周全
    给段代码例子
    public class Test {
        public static void main(String[] args) throws Throwable {
           String separator = System.getProperty("line.separator");
           String content = "function saveData(){" + separator +
                            "    var sid=\"10001\";" + separator +
                            "    test1();" + separator +
                            "    save();  //test2" + separator +
                            "/*\ntest3\n*/" + separator +
                            "//test4" + separator +
                            //"    test2();" + separator +
                            "}";
           content = content.replaceAll("(?s).*?save[(][)];(.*?})", "$1"); //获取save()后面的字符串
           //System.out.println(content);
           if (content.matches("((\\s*//.*?\\s+)*((?s)\\s*/[*].*?[*]/\\s*)*)*\\s*[}]")) {
               System.out.println("ok"); //判断save后面的字符串是不是注释或空白
           } else {
               System.out.println("error");
           }
        }
    }