2015-06-12 4 views
1

мне нужно, чтобы соответствовать следующей строки:Как совместить строку перед чем-то или в конце строки?

" 4/abc def" 

из

" 4/abc def 5/abc" 

или

" 4/abc def" 

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

(?<MyGroup> 4\/(.+)(?=(?: \d\/))) 

и I tr чтобы сделать lookahead необязательным ? или добавить |$, но затем он ловит все. Могу ли я каким-то образом сделать 5/abc опциональным?

Я пробовал с этими выражениями, но они не работают в обоих случаях:

(?<MyGroup> 4\/(.+)(?=(?: \d\/)?)) 
(?<MyGroup> 4\/(.+)(?=(?: \d\/|$))) 

SAMPLE

EDIT:

Я вынужден использовать период, потому что может любым персонажем. Это поле свободного текста.

+0

для конца строки должн str.endsWith («строка») – Raghuveer

+0

EndsWith не будет работать здесь, потому что это часть большего выражения с несколькими дополнительными полями. – t3chb0t

+0

OK - так вот: '' похоже, что у вас есть XML. У вас есть XML? Потому что, если это так, синтаксический анализ регулярных выражений работает не очень хорошо, но синтаксический анализ XML работает блестяще. – Sobrique

ответ

1

Сделать .+ ленивым, добавив ? и добавить чередование в $

(?<MyGroup> 4\/(.+?)(?=(?: \d\/)|$)) 
  • (.+?) Ленивое соответствие вызывает регулярное выражение двигателя, чтобы остановить, когда он видит первый \d/ чем продолжать до конца строка.

Regex Demo

+0

К сожалению, может быть любой персонаж. Вот почему я взял «.». Извините, не упомянув об этом в моем вопросе. Я обновлю его. – t3chb0t

+0

@ t3chb0t Я исправил свой ответ. Проверьте, соответствуют ли ваши требования. – nu11p01n73R

+0

Я полностью забыл о ленивом операторе. Thx, теперь он делает то, что должен :) – t3chb0t

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