Регулярное выражение 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
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
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, вы можете просто заменить последнюю ? на * из регулярного выражения.

Демо

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