2013-09-10 5 views
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)" 

Здесь условие 1 хорошее, но 2 и 3 нет, так как у них нет места. Как я могу это достичь?

+0

У вас есть список допустимых команд/ключевых слов в списке где-нибудь? – Cruncher

+0

Используйте регулярные выражения, чтобы проверить это. – JNYRanger

+0

В качестве отправной точки попробуйте [String.split()] (http://pages.cs.wisc.edu/~hasti/cs302/examples/Parsing/parseString.html)? – paulsm4

ответ

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. правда
+0

Большое вам спасибо за вашу помощь. Ты обалденный! – user2766131

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 в качестве сепаратора обеспечивают. между каждой строкой и каждым разделителем должен быть хотя бы один пробельный символ или строка отформатирована неправильно.

+0

Не будет ли разделение на «И | ИЛИ» проще? – Cruncher

+0

Я хочу напечатать ошибку в каждом случае, я вынул логическое значение и поместил свою ошибку печати вместо возврата, но получил wierd result.sorry Я новичок в java. – user2766131

+0

@ user2766131 как вы можете получить результат wierd, если этот метод полностью действителен? – dantuch

2

Если вы просто ищете «состояние нормально» или нет, то это просто этот код :

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

Обычный экспресс при поиске И, ИЛИ с не-пробелами перед или позади него (или и тем и другим).

Дополнительно:

  1. Если вы хотите знать, в каком положении недостающее пространство, я бы порвал с «(AND | OR)», как регулярные выражения и проверять каждую строку в массиве resulitng, если он начинается или заканчивается символом без пробелов.

  2. Если само условие может содержать И или ИЛИ, как такое условие: "S(GLH**OR**D) AND S(GLSHOVE)", то я хотел бы попробовать ANTLR

+0

Вы протестировали его? ;) – dantuch

+0

На самом деле да :-) С тремя условиями в вопросе и пустой строкой. Результат был ложным, истинным, истинным, ложным (для пустого) – jboi

+0

@jobi inddeed, но 1 нормально, 2 и 3 не в порядке. И ваше имя метода метода предполагает, что результаты должны быть: true, false, false. :) IMO Вам нужно добавить отрицание в начале. – dantuch

Смежные вопросы