Java 如何查找和比较字符串中同一类型的所有关键字
我想用java编写一个方法来解析一个字符串,它是一个条件短语,并比较在所有logical关键字之前和之后是否至少有一个空格。例如:Java 如何查找和比较字符串中同一类型的所有关键字,java,Java,我想用java编写一个方法来解析一个字符串,它是一个条件短语,并比较在所有logical关键字之前和之后是否至少有一个空格。例如: String condition1 = "S(GLHOLD) AND S(GLSHOVE) OR S(PLINK) OR S(PSHARE) AND S(PSTT) AND S(PNET)" String condition2 = "S(GLHOLD) AND S(GLSHOVE) OR S(PLINK)OR S(PSHARE) AND S(PS
String condition1 = "S(GLHOLD) AND S(GLSHOVE) OR S(PLINK) OR S(PSHARE) AND S(PSTT) AND S(PNET)"
String condition2 = "S(GLHOLD) AND S(GLSHOVE) OR S(PLINK)OR S(PSHARE) AND S(PSTT) AND S(PNET)"
String condition3 = "S(GLHOLD) ANDS(GLSHOVE) OR S(PLINK) OR S(PSHARE) AND S(PSTT) AND S(PNET)"
这里条件1是好的,但2和3不是,因为它们缺少空间。我如何才能做到这一点?您的答案将类似于:
private static boolean isValid(final String condition)
{
String[] splitValues = condition.split("AND|OR");
if (!splitValues[0].endsWith(" "))
{
return false;
}
if (!splitValues[(splitValues.length - 1)].startsWith(" "))
{
return false;
}
for (int index = 1; index < (splitValues.length - 1); ++index)
{
if (!splitValues[index].startsWith(" "))
{
return false;
}
if (!splitValues[index].endsWith(" "))
{
return false;
}
}
return true;
}
私有静态布尔值有效(最终字符串条件)
{
String[]splitValues=condition.split(“AND | OR”);
如果(!splitValues[0].endsWith(“”)
{
返回false;
}
如果(!splitValues[(splitValues.length-1)].startsWith(“”)
{
返回false;
}
对于(int index=1;index<(splitValues.length-1);++索引)
{
如果(!splitValues[index].startsWith(“”)
{
返回false;
}
如果(!splitValues[index].endsWith(“”)
{
返回false;
}
}
返回true;
}
使用AND和OR作为分隔符拆分字符串。在每个字符串和每个分隔符之间,必须至少有一个空格字符,否则该字符串的格式不正确。您的答案与此类似:
private static boolean isValid(final String condition)
{
String[] splitValues = condition.split("AND|OR");
if (!splitValues[0].endsWith(" "))
{
return false;
}
if (!splitValues[(splitValues.length - 1)].startsWith(" "))
{
return false;
}
for (int index = 1; index < (splitValues.length - 1); ++index)
{
if (!splitValues[index].startsWith(" "))
{
return false;
}
if (!splitValues[index].endsWith(" "))
{
return false;
}
}
return true;
}
私有静态布尔值有效(最终字符串条件)
{
String[]splitValues=condition.split(“AND | OR”);
如果(!splitValues[0].endsWith(“”)
{
返回false;
}
如果(!splitValues[(splitValues.length-1)].startsWith(“”)
{
返回false;
}
对于(int index=1;index<(splitValues.length-1);++索引)
{
如果(!splitValues[index].startsWith(“”)
{
返回false;
}
如果(!splitValues[index].endsWith(“”)
{
返回false;
}
}
返回true;
}
使用AND和OR作为分隔符拆分字符串。在每个字符串和每个分隔符之间,必须至少有一个空格字符,否则该字符串的格式不正确。使用正则表达式,可以:
public static boolean containsSeparated(String condition, List<String> keywords) {
for (String word : keywords) {
Pattern p = Pattern.compile("\\S" + word + "|" + word + "\\S");
Matcher matcher = p.matcher(condition);
boolean foundNotSeparated = matcher.find();
if (foundNotSeparated) {
return false;
}
}
return true;
}
印刷品:
使用regex,这可以实现:
public static boolean containsSeparated(String condition, List<String> keywords) {
for (String word : keywords) {
Pattern p = Pattern.compile("\\S" + word + "|" + word + "\\S");
Matcher matcher = p.matcher(condition);
boolean foundNotSeparated = matcher.find();
if (foundNotSeparated) {
return false;
}
}
return true;
}
印刷品:
如果您只是在查找“条件是否正常”,则只需以下代码:
private static boolean spacesEverywhere(String condition) {
return !condition.toUpperCase().matches(".*((AND|OR)\\S+|\\S+(AND|OR)).*");
}
正则表达式搜索AND,或在AND之前或之后搜索非空格(或两者都搜索)
此外:
“S(GLH**或**D)和S(glspow)”
,那么我会尝试使用ANTLR如果您只是在查找“条件是否正常”,则只需以下代码:
private static boolean spacesEverywhere(String condition) {
return !condition.toUpperCase().matches(".*((AND|OR)\\S+|\\S+(AND|OR)).*");
}
正则表达式搜索AND,或在AND之前或之后搜索非空格(或两者都搜索)
此外:
“S(GLH**或**D)和S(glspow)”
,那么我会尝试使用ANTLR您是否在某个列表中有一个有效命令/关键字列表?请使用正则表达式对此进行测试。作为起点,请尝试?一个简单的ANTLR解析器也可以做到这一点。为了澄清,您希望您的方法如何处理Condition2和condition3?你想让它抛出一个非法的ArgumentException吗?还是只返回一个布尔值false?还是要返回字符串数组?我不确定您是否正在尝试解析字符串,或者只是看看它是否在逻辑上可解析。列表中是否有有效命令/关键字的列表?请使用正则表达式对此进行测试。作为起点,尝试一下?简单的ANTLR解析器也可以做到这一点。为了澄清,您希望您的方法对CONTION2和CONTION3做什么?你想让它抛出一个非法的ArgumentException吗?还是只返回一个布尔值false?还是要返回字符串数组?我不确定您是否正在尝试解析字符串,或者只是看看它是否在逻辑上可解析。使用“AND |或“更简单”进行拆分不是更容易吗?我想在每种情况下打印错误,我取出了布尔值,并将打印错误改为返回值,但得到的是wierd结果。很抱歉,我是java新手。@user2766131如果此方法完全有效,如何获得wierd结果?请使用布尔值。当方法返回false时,条件为错误。打印当时的错误。在“AND |或”上拆分不是更容易吗?我想在每种情况下打印错误,我取出了布尔值并将我的打印错误放在那里而不是返回,但得到了wierd结果。很抱歉,我是java新手。@user2766131如果此方法完全有效,如何获得wierd结果?请使用布尔值。当方法返回false时,条件为错误。打印当时的错误。您测试过吗?;)事实上是:-)问题中的三个条件和一个空字符串。结果为false,true,true,false(为空)@jobi inddect,但1可以,2和3不可以。您的方法名称建议结果应为:真、假、假。:)在我看来,你需要在开头加上否定。你测试过了吗?;)事实上是:-)问题中的三个条件和一个空字符串。结果为false,true,true,false(为空)@jobi inddect,但1可以,2和3不可以。您的方法名称建议结果应为:真、假、假。:)在我看来,你需要在开头添加否定。非常感谢你的帮助。你真棒!非常感谢大家的帮助。你真棒!