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}),.* )

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

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

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

Похожие вопросы