Java 如何查找和比较字符串中同一类型的所有关键字

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

我想用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(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之前或之后搜索非空格(或两者都搜索)

    此外:

  • 如果您想知道缺少的空格在哪个位置,我将使用“(AND | OR)”作为正则表达式进行拆分,并检查结果数组中的每个字符串是否以非空白字符开头或结尾

  • 如果条件本身可以包含AND或or,比如这样一个条件:
    “S(GLH**或**D)和S(glspow)”
    ,那么我会尝试使用ANTLR


  • 如果您只是在查找“条件是否正常”,则只需以下代码:

    private static boolean spacesEverywhere(String condition) {
        return !condition.toUpperCase().matches(".*((AND|OR)\\S+|\\S+(AND|OR)).*");
    }
    
    正则表达式搜索AND,或在AND之前或之后搜索非空格(或两者都搜索)

    此外:

  • 如果您想知道缺少的空格在哪个位置,我将使用“(AND | OR)”作为正则表达式进行拆分,并检查结果数组中的每个字符串是否以非空白字符开头或结尾

  • 如果条件本身可以包含AND或or,比如这样一个条件:
    “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不可以。您的方法名称建议结果应为:真、假、假。:)在我看来,你需要在开头添加否定。非常感谢你的帮助。你真棒!非常感谢大家的帮助。你真棒!