Регулярное выражение Java не содержит char, а если и содержит, то оно не соответствует строке

Я пытаюсь написать простое регулярное выражение Java, которое соответствует следующей комбинации:

  • Строка содержит только некоторые из этих символов: [A-ZÑÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛºª \\-]
  • Если он содержит среднюю точку, он должен содержать ровно L·L

Следующие строки действительны:

  • АБКЛ·LGG
  • АБКЛ
  • BCC

Следующие строки недействительны:

  • ВСЕ·
  • А·LLL
  • ·ЛЛ

Как добавить в список исключение «L·L»?

976L·LA действителен?

MC Emperor 23.02.2023 08:19

Нет, это не позволяет номера. Я изменил шаблон несколько минут назад, изначально у него был ^, чтобы разрешить все, кроме этих символов. Я удалил, как только я заметил.

maqjav 23.02.2023 08:38

Хорошо, но тогда вам нужно изменить ответ Николаса, заменив точку . (обычную, а не среднюю) соответствующим классом символов.

MC Emperor 23.02.2023 08:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы использовал группу захвата с двумя вариантами (разделенными |). Смотрите демо на Regex101.

^([A-ZÑÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛºª \\-]+|.+L·L.+)$
^                                            start of the string
 (                             |       )     2 alternatives capturing group
  [A-ZÑÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛºª \\-]               a defined set of characters
                              +              ... at least a single character
                                .+L·L.+      anything between L·L
                                        $    end of the string

Простой тест на Java (обратите внимание на экранирование определенных символов):

var p = Pattern.compile("^([A-ZÑÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛºª \\\\-]+|.+L·L.+)$");
Stream.of("ABCL·LGG", "AALL·", "A·LLL", "·LL")
      .forEach(s -> System.out.println(s + " -> " + p.matcher(s).matches()));
ABCL·LGG -> true
AALL· -> false
A·LLL -> false
·LL -> false

А так просто :), спасибо за уточнение, я написал оба выражения по отдельности, но не понял, как их соединить^( group1 | group2 )$

maqjav 23.02.2023 07:37

Я изменил первый шаблон, удалив ^, чтобы вместо этого можно было использовать эти символы, а в моем коде .+L·L.+ на .*L·L*., чтобы этот символ также можно было найти в первой или последней позиции. Большое спасибо за помощь, ваш ответ правильный.

maqjav 23.02.2023 08:00

нам действительно нужны ^ и $ с matches()? @maqjav Правильно ли возвращать true для "%%L·L%%" (поскольку % не находится в первом условии)?

user16320675 23.02.2023 08:23

Если средняя точка (·) может встречаться не более одного раза, то я думаю, что регулярное выражение должно быть таким:

^[A-ZÑÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛºª \\-]+(?:L·L[A-ZÑÁÀÂÉÈÊÍÌÎÓÒÔÚÙÛºª \\-]+)?$

Это не позволит такие вещи, как 976L·LA.

Если вы хотите, чтобы входной текст содержал несколько средних точек, каждая из которых была окружена Ls, вы можете просто заменить последнюю ? на * из регулярного выражения.

Демо

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