Шаблон Java для соответствия любой последовательности символов, кроме заданного списка - PullRequest
7 голосов
/ 23 марта 2009

Как мне написать шаблон (Java) для соответствия любой последовательности символов, кроме заданного списка слов?

Мне нужно выяснить, есть ли в данном коде какой-либо текст, окруженный тегами, например, помимо заданного списка слов. Например, я хочу проверить, есть ли какие-либо другие слова, кроме «один» и «два», окруженные тегом.

"This is the first tag <span>one</span> and this is the third <span>three</span>"

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

Ответы [ 3 ]

7 голосов
/ 23 марта 2009

Предварительный просмотр может сделать это:

\b(?!your|given|list|of|exclusions)\w+\b

Матчи

  • граница слова (начало слова)
  • не сопровождается ни одним из "ваш", "данный", "список", "из", "исключения"
  • с последующими символами из нескольких слов
  • , за которым следует граница слова (конец слова)

По сути, это соответствует любому слову, которое не исключено.

4 голосов
/ 23 марта 2009

Это должно помочь вам начать.

import java.util.regex.*;

// >(?!one<|two<)(\w+)/
// 
// Match the character “>” literally «>»
// Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!one|two)»
//    Match either the regular expression below (attempting the next alternative only if this one fails) «one»
//       Match the characters “one<” literally «one»
//    Or match regular expression number 2 below (the entire group fails if this one fails to match) «two»
//       Match the characters “two<” literally «two»
// Match the regular expression below and capture its match into backreference number 1 «(\w+)»
//    Match a single character that is a “word character” (letters, digits, etc.) «\w+»
//       Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Match the characters “/” literally «</»
List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile(">(?!one<|two<)(\\w+)/");
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group(1));
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}
2 голосов
/ 23 марта 2009

Используйте это:

if (!Pattern.matches(".*(word1|word2|word3).*", "word1")) {
    System.out.println("We're good.");
};

Вы проверяете, что шаблон не соответствует строке.

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