Как найти все слова до определённого слова

Рейтинг: 2Ответов: 3Опубликовано: 22.05.2023

Допустим есть строка

http://test.com/article/page/5

Как подобрать выражение для поиска всего что находится до /page/5, при этом /page/5 может отсутствовать в строке?

(.+(?:\/page\/[0-9]+)?)(\/page\/[0-9]+)?

https://regex101.com/r/jyz20s/1

И чтобы было две группы:
первая до /page/[0-9]
вторая /page[0-9] если есть эта часть

Ответы

▲ 3

Укажите в регулярном выражении начало (^) и конец строки ($), а первую группу сделайте ленивой: .+? вместо .+. Тогда должно получиться что-то вроде этого:

^(.+?)(\/page\/[0-9]+)?$

https://regex101.com/r/1wGC6P/1

▲ 2

Можно ещё вот так, чтобы даже если после /page/x/ что-то было, выражение бы срабатывало.

(^.*?)(\/page\/\d+.*|$)

Работает это так:

  • Выражение начинается на всё что угодно, это мы заворачиваем в отдельную группу.
  • И заканчивается либо на /page/любоеЧисло/необязательный/путь, либо ни на что (то-есть строка завершается).

https://regex101.com/r/kasijR/1

▲ 2

Можно попробовать воспользоваться позитивной группой просмотра вперед:

^.*?(?=\/page\/\d+|$)

Пример на js(из-за интеграции):

const reg = /^.*?(?=\/page\/\d+|$)/gm
const str = `http://test.com/article/page/5
http://test.com/article/nopage/5`
console.log(str.match(reg));