0

我想在java中编写一个方法来解析一个作为条件短语的字符串,并比较所有逻辑关键字前后是否至少有一个空格。例如:

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)"

这里 condition1 很好,但 2 和 3 不是,因为它们缺少空间。我怎样才能做到这一点?

4

3 回答 3

2

如果您只是在寻找“条件是否正常”,那么这只是以下代码:

private static boolean spacesEverywhere(String condition) {
    return !condition.toUpperCase().matches(".*((AND|OR)\\S+|\\S+(AND|OR)).*");
}

正则表达式在其前后(或两者)搜索 AND、OR 和非空格。

此外:

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

  2. 如果条件本身可以包含 AND 或 OR,就像这样的条件:"S(GLH**OR**D) AND S(GLSHOVE)"那么我会尝试 ANTLR

于 2013-09-10T19:12:49.077 回答
1

使用正则表达式,这有效:

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;
}

\S不是空格,因此您需要找到将输入标记为无效的内容,并且应该在给定单词的开头和结尾进行搜索

测试:

public static void main(String[] args) {
    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)";

    List<String> shuoldBeSeparated = Arrays.asList("OR", "AND");
    System.out.println(containsSeparated(condition1, shuoldBeSeparated));
    System.out.println(containsSeparated(condition2, shuoldBeSeparated));
    System.out.println(containsSeparated(condition3, shuoldBeSeparated));
    System.out.println(containsSeparated("A AND B ORCC", shuoldBeSeparated));
    System.out.println(containsSeparated("A AND D", shuoldBeSeparated));
    System.out.println(containsSeparated("A AND B OR C", shuoldBeSeparated));
}

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;
}

印刷:

  1. 真的
  2. 错误的
  3. 错误的
  4. 错误的
  5. 真的
  6. 真的
于 2013-09-10T18:53:22.583 回答
0

您的答案将与此类似:

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;
}

使用 AND 和 OR 作为分隔符拆分字符串。在每个字符串和每个分隔符之间,必须至少有一个空格字符,否则字符串格式不正确。

于 2013-09-10T18:48:41.610 回答