2015-07-22 2 views
0

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

Ex1 - anyanyany группы 1 должны быть anyanyany

Ex2 - anyanyany.abcany группы 1 должно быть anyanyany

Ex3 - anyany.abcde.fghi группа 1 должны быть anyany.abcde

Когда я пытаюсь (.+)(?:\.), он возвращает только Ex2 и Пример 3. Если я изменил его на (.+)(?:\.)*, он вернет ту же строку ввода.

Я действительно не знаю, что я должен сделать, чтобы решить эту проблему. Кто-то может мне помочь? Какое знание мне не хватает?

https://regex101.com/r/jG6wY8/2

+1

Почему вы не просто ищите последнего символа '.' ? –

ответ

2

Попробуйте это не жадное регулярное выражение.

(.+?)(?:\.[^.]*)?$ 

В Java вы должны обратный слеш еще один раз, так что это будет похоже,

Pattern p = Pattern.compile("(.+?)(?:\\.[^.]*)?$"); 

DEMO

3

Вы можете использовать это регулярное выражение:

^([^.]+(?:\.[^.]+)?) 

RegEx Demo

PS: Используется ^([^.\n]+(?:\.[^.\n]+)?) в regex101 demo, так как демо имеет несколько входов в разных строках.

+0

Если идея состоит в том, чтобы захватить все, кроме последней точки плюс буквы, то ваше регулярное выражение не будет выполнено с помощью abc.def.ghi.jkl, т. Е. Оно возвращает только abc.def, и мне не нравится \ n там - в чем его цель? – laune

+0

Идея заключалась в том, чтобы захватить строку с одной или двумя точками. Так что да, он будет соответствовать 'abc.def' из' abc.def.ghi.jkl.mno.pqr' – anubhava

+0

@anubhava спасибо за ответ (+1). Но это не сработает. – Paulo

0

Вместо того, чтобы регулярное выражение, чтобы захватить разыскиваемую часть, устранить нежелательный :

s = s.replaceAll("\\.[^.]+$",""); 
0

Попробуйте следующие шаблоны регулярных выражений, чтобы соответствовать вашим Критерии:

  • Если вы должны были соответствовать первым двух словам лексических точки: ^([^\.]+)(?:\.[^\.]+)?$|(?:([^\.]+\.[^\.]+)\.)

    a => a a.b => a a.b.c => a.b a.b.c.d => a.b

  • Если вы должны были соответствовать каждые словам лексических точки, но не последняя лексема: ^([^\.]+)(?:\.[^\.]+)?$|(?:([^\.]+\.[^\.]+)\.)

    a => a a.b => a a.b.c => a.b a.b.c.d => a.b.c

+0

Вам не нужно избегать точки (.) Между [и]. И регулярное выражение не соответствует a.b.c.d – laune

+0

@laune: я отредактировал свой ответ, чтобы выполнить ваши комментарии. – Eder

Смежные вопросы