[java.util.regex.Pattern] Грамотный шаблон для символов типа "\", "|"

durka82

и тп.
Например для строки: "123 FGH 567 |Земля||Луна|" - приходится использовать шаблон
(\\d+) \\s* (.+\\b)\\s* (\\d+) \\s*\\B\\p{Punct}(.+)\\p{Punct}{2}(.+)\\p{Punct}
, где в качестве "|" используется "\p{Punct}" (красным выделил выдираемые части текста/шаблона).
Это и не очень правильно, так как там в принципе могут стоять и другие символы.
Но ни "|", ни "\|", ни "[|]" не работает (шаблон сразу ломается).
В чем тут дело?
Что я делаю не так?
И вообще, с интересом выслушаю все советы на тему, как это лучше написать

Maurog

используй в этом форуме
  [code]  [/code]   

durka82

Я в курсе про
  
.
Просто он не поддерживает форматирование, а я хотел выделить цветом.
п.с.: вот так Надежда и умирает - смотришь, что кто-то ответил, а на самом деле нет

Maurog

прошу прощения

durka82

И еще, я правильно понимаю, что "" используются и для указания на искомую подстроку, и для группировки элементов (например для указания их численности)?
Или для группировки есть другая конструкция?

buka

хмм... у меня
System.console.format("%b%n", Pattern.compile("(\\d+)\\s+(\\w+)\\s+(\\d+)\\s+\\|(.+?)\\|\\|(.+?)\\|").matcher("123 FGH 567 |Земля||Луна|").find;
"true" пишет

anton7805

Но ни "|", ни "\|", ни "[|]" не работает (шаблон сразу ломается).

странно это. Т.к. '\' '|' - служебные символы, то в регэкспе ,доступ к таким символам через \, т.е. "\\ '\|'
соответсвенно. Т.к. один \ виндой сжирается , то
[\\|\\\\](.+) должно работать

buka

Т.к. один \ виндой сжирается

anton7805

только узнал про это?

durka82

[\\|\\\\](.+) должно работать

Я знал, что она жадная, но не думал, что настолько
Я правильно понял, что
[\\|\\\\]
есть выбор из двух символов:
\\|
(который как раз "|") и
\\\\
(который "\")?
В принципе я заменил
\\p{Punct}
на
\x5С
и
\x7С
соответственно, но такой вариант менее читабелен.
п.с.: ну почему использование тега код так некомпактно

durka82

А у тебя ось какая?
Linux?

buka

ось в Яве почти не важна
один раз эскейпим для регэкспа: «\» -> «\\», «|» -> «\|»,
второй раз — для Явы: «\\» -> «\\\\», «\|» -> «\\|»
Венда голодает

durka82

Бедная
Давайте проведем сбор пожертвований в пользу голодающей винды
Всем спасибо, буду пробовать

psm-home

А вообще, попробуй Groovy юзать. Это такой Perl, но поддерживающий синтаксис Java и интегрирующийся с ней, как только можно. Для всяких скриптов рулит неимоверно. И, поскольку регулярки встроены в язык, нету этого дебильного двойного эскейпинга.

durka82

Спасибо, посмотрю

durka82

Вариант с большим кол-вом слэшей прокатил
Возник такой вопрос (полагаю, что ответ отрицательный, но вдруг...):
Шаблоны типа (регэксп)+ этот класс поддерживает, но выводит только последнее вхождение
Можно как-то получить их все?
А то получается, что groupCount практической пользы не несет (ведь он равен кол-ву в шаблоне).
А то самое то бы было: получаем groupCount-ом реальное кол-во получившихся групп и обрабатываем их за раз.
Иерархии так удобно обрабатывать.

pitrik2

Можно как-то получить их все?
вроде нельзя
надо чтото типа while(match) по этому подвыражению делать и по всем проходить

durka82

Я так и думал
надо чтото типа while(match) по этому подвыражению делать и по всем проходить
Наверное лучше использовать старый добрый split
Что я и сделал.

kruzer25

Уж не знаю насчёт джавы, но в пхп есть preg_match, который ведёт себя как раз так, как ты описал; и есть preg_match_all, который ловит все совпадения. Может, и тут так же?
Оставить комментарий
Имя или ник:
Комментарий: