Регулярное выражение Java, соответствует всем, кроме - PullRequest
6 голосов
/ 30 июня 2009

Я бы хотел соответствовать всем, кроме *.xhtml. У меня есть сервлет, слушающий *.xhtml, и я хочу, чтобы другой сервлет перехватил все остальное. Если я сопоставлю сервлет Faces со всем (*), он сработает при обработке значков, таблиц стилей и всего, что не является запросом лиц.

Это то, что я пытался безуспешно.

Pattern inverseFacesUrlPattern = Pattern.compile(".*(^(\\.xhtml))");

Есть идеи?

Спасибо

Walter

Ответы [ 4 ]

13 голосов
/ 30 июня 2009

Вам нужен негативный взгляд назад ( пример java ).

String regex = ".*(?<!\\.xhtml)$";
Pattern pattern = Pattern.compile(regex);

Этот шаблон соответствует всему, что не заканчивается на ".xhtml".

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NegativeLookbehindExample {
  public static void main(String args[]) throws Exception {
    String regex = ".*(?<!\\.xhtml)$";
    Pattern pattern = Pattern.compile(regex);

    String[] examples = { 
      "example.dot",
      "example.xhtml",
      "example.xhtml.thingy"
    };

    for (String ex : examples) {
      Matcher matcher = pattern.matcher(ex);
      System.out.println("\""+ ex + "\" is " + (matcher.find() ? "" : "NOT ") + "a match.");
    }
  }
}

так:

% javac NegativeLookbehindExample.java && java NegativeLookbehindExample                                                                                                                                        
"example.dot" is a match.
"example.xhtml" is NOT a match.
"example.xhtml.thingy" is a match.
7 голосов
/ 30 июня 2009

Не регулярное выражение, но зачем использовать это, когда вам не нужно?

String page = "blah.xhtml";

if( page.endsWith( ".xhtml" ))
{
    // is a .xhtml page match
}       
0 голосов
/ 01 июля 2009

Вы на самом деле пропускаете только «$» в конце вашего паттерна и пропускающий негативный взгляд (это «(^())» не делает этого). Посмотрите на специальные конструкции часть синтаксиса .

Правильный шаблон будет:

.*(?<!\.xhtml)$
  ^^^^-------^ This is a negative look-behind group. 

Средство тестирования регулярных выражений неоценимо в таких ситуациях, когда вы, как правило, полагаетесь на то, что люди дважды проверят ваши выражения за вас. Вместо того, чтобы писать свой собственный, используйте что-то вроде RegexBuddy в Windows или Reggy в Mac OS X. Эти инструменты имеют настройки, позволяющие вам выбирать движок регулярных выражений Java (или аналогичный ему) для тестирования. Если вам нужно проверить выражения .NET, попробуйте Expresso . Также вы можете просто использовать Sun test-harness из их руководств, но это не так поучительно для формирования новых выражений.

0 голосов
/ 30 июня 2009

Вы можете использовать отрицательное прогнозное утверждение:

Pattern inverseFacesUrlPattern = Pattern.compile("^.*\\.(?!xhtml).*$");

Обратите внимание, что вышеприведенное совпадение подходит только в том случае, если вход содержит расширение (.something).

...