Java 检查字符串的格式

Java 检查字符串的格式,java,pattern-matching,Java,Pattern Matching,我需要生成一个方法来检查字符串是否具有以下格式: [{…},{…},{…},{…}] 但我不确定做这件事的最佳/更简单的方法是什么。我应该迭代字符串还是可以使用模式/匹配器类 一些建议或代码开始将不胜感激 编辑 问题是字符串的格式可能不正确,因此该方法将返回错误。。。接下来,我将展示一些示例,说明可以得到什么以及应该返回什么: [{…},{…},{…}]-->返回有效 [{…},{…}]-->返回有效 [{…},{…},{…},{…},{…}]-->返回有效 […},{…},{…},{…},{…

我需要生成一个方法来检查字符串是否具有以下格式:

[{…},{…},{…},{…}]

但我不确定做这件事的最佳/更简单的方法是什么。我应该迭代字符串还是可以使用模式/匹配器类

一些建议或代码开始将不胜感激

编辑

问题是字符串的格式可能不正确,因此该方法将返回错误。。。接下来,我将展示一些示例,说明可以得到什么以及应该返回什么:

[{…},{…},{…}]
-->返回有效

[{…},{…}]
-->返回有效

[{…},{…},{…},{…},{…}]
-->返回有效

[…},{…},{…},{…},{…}]
-->返回错误

[{…},{…}{…}]
-->返回错误

[{…},{…},{…},{…}
-->返回错误

[{…,{…},{…},{…},{…}]
-->返回错误

[{…},{…},{…}]
-->返回错误


[asd{…},{…},{…},{…}]
-->返回错误;

编辑以反映表示不包含“[”、“]”或“{”的任意字符串的点

String regex = "\\[\\{[^\\[\\]{]*}(,\\{[^\\[\\]{]*})*]";
如果这看起来让人望而生畏,那可能是因为Java字符串字符转义而不是正则表达式本身。如果没有所有转义(必需),它看起来像:

\[\{[^\[\]{]*}(,\{[^\[\]{]*})*]
并通过分隔逻辑分组的空间进一步澄清:

\[   \{[^\[\]{]*}   (,\{[^\[\]{]*})*   ]
第一个和最后一个字符是开头/结尾“[”和“]”的文字匹配。第二个字符表示所需的开头文字“{”,后面是字符类表达式,表示除“[”、“]”或“{”以外的任意(零或更多)个字符,最后是结尾文字“}源字符串中第一个带花括号的分组的

但是,之后可能会有额外的大括号分组,因此括号中的表达式使用前面的文字逗号重复第一个分组,整个表达式可能重复零次或多次

因此,如果这使它更易于阅读或维护,您可以用以下代码表示它:

String subgrp = "\\{[^\\[\\]{]*}";
String optionalRepeatSubgrp = "(," + subgrp + ")*";

String regex = "\\[" + subgrp + optionalRepeatSubgrp + "]";

这似乎解决了大部分问题,但由于我不太擅长消极前瞻,我无法破解下面唯一失败的案例

此代码

  • 递归地用空字符串替换
    {*},
    模式
  • 然后用空字符串替换最后一个
    {*}
  • 剩余的如果与
    []
    匹配,则表示该字符串有效或无效
  • 希望你明白我在这里要做的事

    public static boolean isValid(String input){
    
            // Iterates and replaces all but one substring that match {...},
            boolean replaced = true;
            int oldLength=0, newLength=0;
            while(replaced){
                oldLength=input.length();
                input = input.replaceFirst("\\{[a-z.]+},", "");
                newLength=input.length();
                if(oldLength==newLength)    replaced=false;
            }
    
            // Replaces the last {...} 
            // This one is done separately as comma should not be present in the last part 
            input = input.replaceFirst("\\{.*?}", "");
    
            //Then if the string remaining is just [] then it is valid
            if(input.equals("[]")){
                return true;
            } else {
                return false;
            }
        }
    
        public static void main(String[] args) {
            String[] input = {"[{...},{...},{...}]",
                                "[{...},{...}]",
                                "[{...},{...},{...},{...}]",
                                "[...},{...},{...},{...}]",
                                "[{...},{...}{...}]",
                                "[{...},{...},{...},{...}",
                                "[{...,{...},{...},{...}]",
                                "[{...},{...},,{...}]",
                                "[asd{...},{...},{...},{...}]"
                        };
            for (String s : input) {
                if(isValid(s)){
                    System.out.println("VALID");
                } else {
                    System.out.println("ERROR");
                }
            }
        }
    }
    
    这个输出-

    VALID
    VALID
    VALID
    ERROR
    ERROR
    ERROR
    VALID
    ERROR
    ERROR
    
    因此,这是第三个未正确处理的最后一个案例,即

     [{...,{...},{...},{...}]
    

    这确实需要负前瞻,即正则表达式
    {*},
    不应该与
    {
    匹配,如果它在
    {
    之后和
    }

    之前,为什么不在字符串上迭代,而不是花时间考虑复杂的正则表达式呢

    public boolean isValid(String str){
            if( !str.startsWith("[") || !str.endsWith("]") )
                return false;
    
            if( 1 < str.length() - 2 )
                return false;
    
            str = str.substring(1, str.length() - 2);
    
            String[] array = str.split(",");
            String part;
    
            for( int i = 0 ; i < array.length ; i ++ ){
                part = array[i];
    
                if(!part.startsWith("{") || !part.endsWith("}"))
                    return false;
    
                if( 1 < part.length() - 2 )
                    return false;
    
                part = part.substring(1, part.length() - 2);
    
                if(part.contains("{") || part.contains("}"))
                    return false;
            }
    
            return true;
        }
    
    公共布尔值有效(字符串str){
    如果(!str.startsWith(“[”)| |!str.endsWith(“]))
    返回false;
    如果(1
    你可以使用正则表达式!那么嵌套大括号呢?正则表达式似乎是一个很好的解决方案,请查看java.util.regex库:这将取决于
    字符串的生成方式。如果它像你说的那么简单,只需使用正则表达式,它太复杂了,无法解析(比如XML文件)通过迭代
    字符串
    ,创建您自己的解析器。从外观上看,它可以是JSON
    字符串
    ,如果是这种情况,您不应该自己解析它,而应该使用专用的库。@ThatidotGuy不是所有东西都可以用正则表达式=\hmmm…哪个更复杂?一行正则表达式还是20行正则表达式有6个返回值的代码?如果你不懂正则表达式,请确保这更简单:)当然,但如果你不懂正则表达式,那么你在大多数语言和脚本中都会相当残废。因此,至少学习一些基础知识是值得的。答案不错!非常感谢你的解释!