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个返回值的代码?如果你不懂正则表达式,请确保这更简单:)当然,但如果你不懂正则表达式,那么你在大多数语言和脚本中都会相当残废。因此,至少学习一些基础知识是值得的。答案不错!非常感谢你的解释!