Составление регулярного выражения в Java - PullRequest
0 голосов
/ 09 февраля 2012

Это касается составления регулярного выражения для удовлетворения заданным условиям.

Условия:

  1. Я хотел вернуть true / false, если в абзаце присутствует определенное слово.
  2. Слово может быть где угодно (в начале, в середине или в конце)
  3. Должен возвращаться только для целых слов с исключением. Слову может предшествовать (или) следовать только один специальный символ, например,;; () [] {} и т. Д.
  4. Также это поиск без учета регистра.

В приведенном ниже коде я ищу слово Positive. Я жестко закодировал строку в регулярном выражении. В идеале в этом случае вывод должен быть ложным, но он возвращает истину. Поэтому я не уверен, как это сделать.

String inputStr = "ssdf Positiveasd asd sdfewrewr asd";  
inputStr = inputStr.toUpperCase();  

String patternStr = "[^a-z]*[\\s]?[^\\d\\w]?[POSITIVE\b]+[^a-z]*";  
Pattern pattern = Pattern.compile(patternStr);  

Matcher matcher = pattern.matcher(inputStr);  
boolean matchFound = matcher.matches();  

System.out.println(matchFound);  

Ответы [ 7 ]

1 голос
/ 09 февраля 2012
  1. Вам нужно двойное побег, поэтому \b должно стать \\b

  2. Не ставьте «ПОЗИТИВНО» в квадратных скобках, это создает класс символов, то есть соответствует любому из включенных символов.

    заменить [POSITIVE\b]+ на POSITIVE\b

Когда я правильно понимаю ваши требования, вам нужно только (?i)\\bpositive\\b

(?i) делает ваш inputStr.toUpperCase() ненужным, потому что делает регистр соответствия независимым. \\b является границей слова, что означает, что это правда, если перед вашим словом «положительный» нет символа слова и нет символа слова.

Тестовый код

String s1 = "ssdf Positiveasd asd sdfewrewr asd";
String s2 = "ssdf Positive asd asd sdfewrewr asd";
String s3 = "ssdf poSiTive asd sdfewrewr asd";
String s4 = "ssdf FooPositive asd sdfewrewr asd";

String[] s = { s1, s2, s3, s4 };
String regex = "(?i)\\bpositive\\b";

for(String a : s) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(a);

    if (matcher.find())
        System.out.println(a + " ==> Success");
    else
        System.out.println(a + " ==> Failure");
}

выход

ssdf Positiveasd asd sdfewrewr asd ==> Ошибка
ssdf Положительный asd asd sdfewrewr asd ==> Успех
ssdf poSiTive asd sdfewrewr asd ==> Успех
ssdf FooPositive asd sdfewrewr asd ==> Ошибка

1 голос
/ 09 февраля 2012

Если я вас понимаю, вы хотите сопоставить такие вещи, как

Positive; blah
Positive blah
blah Positive blah

Но не такие вещи, как пример строки или

Positive;; blah
;Positive

Это правильно? Если это так, я чувствую, что вы немного усложняете свое выражение ...

Как насчёт этого?

String patternStr = "[^\\s]+POSITIVE[\\b]?[$\\s]*";
Pattern pattern = Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.find();

Кроме того, вы, вероятно, захотите убедиться, что ваше определение «специального символа» совпадает с тем, что подразумевается под границей слова \ b.

1 голос
/ 09 февраля 2012
(\bPOSITIVE\b) 

сделает свое дело (говорит мой крутой отладчик регулярных выражений).Квадратные скобки определяют класс символов и шаблон круглых скобок (не забудьте удвоить \ в строковом литерале Java)

1 голос
/ 09 февраля 2012

Одна из ваших проблем заключается в том, что \b означает «символ возврата» (которого явно нет в строке, с которой вы пытаетесь сопоставить).

Вы хотите \\b (который механизм регулярных выражений получает после обработки строки как \b (граница слова)).Не забывайте, что вам нужно избегать обратной косой черты в строке Java.

Хотя я бы построил регулярное выражение по-другому.Тем не менее, я не понимаю, что вы подразумеваете под вашим требованием нет.3. Не могли бы вы привести несколько примеров, иллюстрирующих это?

0 голосов
/ 09 февраля 2012

Может быть проще сделать что-то вроде:

public boolean doesInputContainWord(String inputStr, String word) {
    inputStr = inputStr.toLowerCase().replaceAll("[^a-z]", " ");
    word = " " + word.toLowerCase() + " ";
    return inputStr.contains(word);
}

Это заменяет каждый символ во входной строке, который не является буквой, пробелом, а затем проверяет, содержит ли текст преобразования word. Обратите внимание, что это <space> + <word> + <space>.

Или, если вы действительно хотите использовать регулярное выражение для сопоставления, я бы предложил удалить [] вокруг "ПОЗИТИВНО", а также \b и +, которые последуют. Скобки определяют класс символов, что в данном случае не то, что вам нужно. Вы хотите найти буквальный текст "ПОЗИТИВНО". [POSITIVE]+ будет соответствовать таким вещам, как «OOST» и «VIVE», и практически любой строке, содержащей одну или несколько букв из слова «Positive».

0 голосов
/ 09 февраля 2012

Вы также можете использовать

if(inputStr.indexOf("Positive") > 0){
   //Word is found
}
0 голосов
/ 09 февраля 2012

Попробуйте удалить границу слова \b и посмотрите, вернется ли она в true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...