Положительный просмотр восклицательного знака

Я пытаюсь создать регулярное выражение Java, соответствующее ".jar!"

Загвоздка в том, что я не хочу, чтобы сопоставитель поглотил восклицательный знак. Я попытался использовать Pattern.compile("\\.jar(?=!)"), но это не удалось. Как и экранирование восклицательного знака.

Может ли кто-нибудь заставить это работать или это ошибка JDK?

ОБНОВИТЬ: Я чувствую себя идиотом, Pattern.compile("\\.jar(?=!)") действительно работает. Я использовал Matcher.matches () вместо Matcher.find ().

Не удаляйте, это все равно информативно для других, которые могут совершить ту же ошибку.

Kent Fredric 16.11.2008 00:58
oleswanson.com/images/office/mistakes.jpg :)
Kent Fredric 16.11.2008 00:59

Честно говоря, я пока оставлю это :)

Gili 16.11.2008 01:18

Для более простого и менее подверженного ошибкам регулярного выражения с Java я рекомендую myregexp.com Этот сайт содержит апплет для создания регулярного выражения Java, И он также доступен как плагин для Eclipse.

P Arrayah 16.11.2008 09:15
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
2 167
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Кроме того, вы можете попробовать боксировать

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(?=[!]) 

Он семантически ничем не отличается от шаблона в вопросе.

Avi 16.11.2008 00:38
Ответ принят как подходящий

У меня работает ваше регулярное выражение (с использованием 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 (), что требует совпадения всего входного шаблона.

Avi 16.11.2008 00:40

Другие вопросы по теме