Класс закрытых символов (регулярное выражение)

1

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

Я ищу регулярное выражение для этого:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)

Это дает Unclosed Character Class на конечной закрывающей скобке, которую я изо всех сил пытался решить. Регулярное выражение работает как обычно в RegexR (http://regexr.com/?38k63)

Может ли кто-нибудь помочь или прозреть?

Заранее спасибо.

Теги:

3 ответа

3
Лучший ответ

Ошибка здесь:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
                   ^

В классе символов ^ по-прежнему является особым символом. Он обычно отрицает других персонажей, когда вы их размещаете. Поэтому избегайте его с помощью \\ в Java.

  • 0
    Ага, спасибо! Затмение и многие другие «верификаторы» не давали мне точного местоположения, поэтому я был довольно смущен.
  • 1
    Я считаю, что ^ - это особый персонаж, только когда он является первым в классе персонажей, как здесь. [a^] будет соответствовать либо a либо ^ .
Показать ещё 1 комментарий
2

Различные двигатели регулярных выражений будут обрабатывать [^] разному. Некоторые предполагают, что это начало отрицательного символьного класса, исключая ] и любые символы до следующего ] в шаблоне (например, [^][] будут соответствовать всем, кроме ] и [). Другие двигатели будут рассматривать как пустой отрицательный класс символов (который будет соответствовать чему-либо). Вот почему некоторые механизмы регулярных выражений будут работать, а другие сообщают об этом как об ошибке.

Если вы имели в виду, чтобы он соответствовал буквенному символу ^, вам нужно избежать этого:

(jump *[A-Z].*)(?:[\^])*?([A-Z].*:)

Или еще лучше, просто удалите его из класса символов (вам все равно придется скрывать его, потому что ^ имеет особое значение вне класса символов):

(jump *[A-Z].*)(?:\^)*?([A-Z].*:)

Или если вы предназначались для этого, чтобы соответствовать всем до следующего [AZ].*: Попробуйте класс символов следующим образом:

(jump *[A-Z].*)(?:[\s\S])*?([A-Z].*:)

И, конечно, потому что это Java, не забывайте, что вам нужно избежать всех символов \ в любых строковых литералах.

1

Проблема здесь при использовании [^]:

(jump *[A-Z].*)(?:[^])*?([A-Z].*:)
                   ^
-------------------|

Попробуйте это регулярное выражение:

(jump *[A-Z].*)[\\s\\S]*?([A-Z].*:)

Или это:

(?s)(jump *[A-Z].*).*?([A-Z].*:)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню