Java регулярное выражение, чтобы принять любое слово, кроме ни - PullRequest
1 голос
/ 06 декабря 2011

Мне нужно регулярное выражение, чтобы соответствовать любой строке, кроме ни одного.Я пытался использовать обычный exp = "^ [^ none] $", но он не работает.

Ответы [ 4 ]

1 голос
/ 06 декабря 2011

Если вы сопоставляете String с определенным словом в Java, вы должны использовать equals(). В этом случае вы хотите инвертировать соответствие, чтобы ваша логика стала:

if(!theString.equals("none")) {
  // do stuff here
}

Гораздо меньше ресурсов и интуитивно понятнее.

Если вам нужно сопоставить строку, содержащую слово «none», вы, вероятно, ищете что-то вроде:

if(theString.matches("\\bnone\\b")) {
  /* matches theString if the substring "none" is enclosed between 
   * “word boundaries”, so it will not match for example: "nonetheless"
   */
}

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

int i = theString.indexOf("none");
if(i > -1) {
    if(i > 0) {
       // check theString.charAt(i - 1) to see if it is a word boundary 
       // e.g.: whitespace
    }
    // the 4 is because of the fact that "none" is 4 characters long.
    if((theString.length() - i - 4) > 0) {
       // check theString.charAt(i + 4) to see if it is a word boundary 
       // e.g.: whitespace
    }
}
else {
    // not found.
}
1 голос
/ 06 декабря 2011

Вы можете использовать регулярное выражение (?!^none$).*. Подробности смотрите в этом вопросе: Обратное соответствие регулярных выражений для конкретной строки?

Причина, по которой "^[^none]$" не работает, заключается в том, что вы действительно сопоставляете все строки, кроме строк "n", "o" или "e".

Конечно, было бы проще просто использовать String.equals так: !"none".equals(testString).

0 голосов
/ 07 декабря 2011

Это регулярное выражение, которое вы ищете:

Pattern p = Pattern.compile("^(?!none$).*$");
Matcher m = p.matcher("your string");
System.out.println(s + ": " + (m.matches() ? "Match" : "NO Match"));

Сказав это, если вы не обязаны использовать регулярное выражение, которое соответствует всем, но "нет", тем проще, быстрее, яснееи легко написать и понять это:

Pattern p = Pattern.compile("^none$");

Затем вы просто исключаете совпадения.

Matcher m = p.matcher("your string");
System.out.println(s + ": " + (m.matches() ? "NO Match" : "Match"));
0 голосов
/ 06 декабря 2011

На самом деле это регулярное выражение для соответствия всем словам, кроме «слова»:

Pattern regex = Pattern.compile("\\b(?!word\\b)\\w+\\b");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    // matched text: regexMatcher.group()
    // match start: regexMatcher.start()
    // match end: regexMatcher.end()
}

Вы должны использовать границы слов, чтобы «слово» не содержалось в других словах.

Объяснение:

"
\b          # Assert position at a word boundary
(?!         # Assert that it is impossible to match the regex below starting at this position (negative lookahead)
   Lorem       # Match the characters “Lorem” literally
   \b          # Assert position at a word boundary
)
\w          # Match a single character that is a “word character” (letters, digits, etc.)
   +           # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
\b          # Assert position at a word boundary
"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...