Я пытаюсь создать регулярное выражение Java, соответствующее ".jar!"
Загвоздка в том, что я не хочу, чтобы сопоставитель поглотил восклицательный знак. Я попытался использовать Pattern.compile("\\.jar(?=!)"), но это не удалось. Как и экранирование восклицательного знака.
Может ли кто-нибудь заставить это работать или это ошибка JDK?
ОБНОВИТЬ: Я чувствую себя идиотом, Pattern.compile("\\.jar(?=!)") действительно работает. Я использовал Matcher.matches () вместо Matcher.find ().
Честно говоря, я пока оставлю это :)
Для более простого и менее подверженного ошибкам регулярного выражения с Java я рекомендую myregexp.com Этот сайт содержит апплет для создания регулярного выражения Java, И он также доступен как плагин для Eclipse.




Кроме того, вы можете попробовать боксировать
Pattern.compile("\\.jar(?=[!])")
Java must be broken: Perl
use strict;
use warnings;
my @data = qw( .jar .jar! .jarx .jarx! );
my @patterns = (
"\\.jar(?=!)",
"\\.jar(?=\\!)",
"\\.jar(?=[!])",
);
for my $pat ( @patterns ){
for my $inp ( @data ) {
if ( $inp =~ /$pat/ ) {
print "$inp =~ $pat \n";
}
}
}
->
.jar! =~ \.jar(?=!)
.jar! =~ \.jar(?=\!)
.jar! =~ \.jar(?=[!])
Он семантически ничем не отличается от шаблона в вопросе.
У меня работает ваше регулярное выражение (с использованием Sun JDK 1.6.0_02 для Linux):
import java.util.regex.*;
public class Regex {
private static final String text = ".jar!";
private static final String regex = "\\.jar(?=!)";
public static void main(String[] args) {
Pattern pat = Pattern.compile(regex, Pattern.DOTALL);
Matcher matcher = pat.matcher(text);
if (matcher.find()) {
System.out.println("Match: " + matcher.group());
} else {
System.out.println("No match.");
}
}
}
печатает:
Match: .jar
(без !)
Возможно, ваша проблема заключалась в том, что вы использовали Matcher.matches () вместо .find (), что требует совпадения всего входного шаблона.
Не удаляйте, это все равно информативно для других, которые могут совершить ту же ошибку.