Задать вопрос
andreycha
@andreycha

Помогите с регэкспом (Java)

Есть некоторый набор строк, содержащих значения, разделенные запятыми. Среди них нужно отфильтровать те, у которых первое значение — или любое число, или «NA».

Валидные строки:
2,whatever
NA,whatever
45345,whatever

Невалидные строки:
,whatever
bla-bla,whatever
a2,whatever
NANA,whatever

Окей, написал выражение:

(?m)^(\d+|NA{1}),.*

Все работает чудесно. Однако затем выяснилось, что в части whatever могут встречаться терминальные символы (\t, \r, \n etc.). Модифицировал выражение:

(?m)^(\d+|NA{1}),(.|\s)* (как вариант — (?s)(?m)^(\d+|NA{1}),.* )

И не тут-то было, теперь все строки, включая невалидные, начали ему удовлетворять.

Подскажите пожалуйста, где я ошибся?
  • Вопрос задан
  • 2764 просмотра
Подписаться 1 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
  • Академия Эдюсон
    Java-разработчик: тариф Базовый
    8 месяцев
    Далее
  • Skillbox
    Профессия Java-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
@Optik
(?<!\S)(?:NA|\d{1,}),(?:.|\s)+?(?=(?:\n.+,)|$)
Попробуйте это, если скармливаете все строки разом а не по одной. Ну и разделитель строк брался \n, если что учтите.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
soider
@soider
Может стоит воспользоваться какой-нибудь библиотекой для работы с csv?
Ответ написан
вы ему даёте .* и (.|\s)*, это жрёт всё подряд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Казань
от 75 000 ₽
ИТРУМ Ростов-на-Дону
от 75 000 ₽
СофтМоушен Санкт-Петербург
от 150 000 до 220 000 ₽