В группе захвата регулярных выражений исключите одно слово - PullRequest
1 голос
/ 14 июня 2019

У меня есть этот тип URL:

https://example.com/en/app/893245
https://example.com/ru/app/wq23245
https://example.com/app/8984245

Я хочу извлечь только слово между com и app

https://example.com/en/app/893245 -> en
https://example.com/ru/app/wq23245 -> ru
https://example.com/app/8984245 ->

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

.*com\/((?!app).*)\/app

Возможно ли что-то подобное, но исключить захват слова app? example\.com\/(\w+|?!app)\/

Рубулярная ссылка: https://rubular.com/r/NnojSgQK7EuelE

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

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

/(?<=example\.com\/)\w+(?=\/app)/

Или, возможно, лучше в контексте URL:

/(?<=example\.com\/)[^\/]+(?=\/app)/

См. Демонстрационную версию Rubular .

В Ruby вы можете использовать

strs = ['https://example.com/en/app/893245','https://example.com/ru/app/wq23245','https://example.com/app/8984245']
strs.each { |s|
    p s[/example\.com\/(\w+)\/app/, 1]
}
# => ["en", "ru", nil]
0 голосов
/ 14 июня 2019

вы можете использовать sed

sed -n -f script.sed yourinput.txt

и внутри script.sed:

s/.*com\/\(.*\)\/app.*/\1/p

Пример ввода:

https://example.com/en/app/893245
https://example.com/ru/app/wq23245
https://example.com/app/8984245

Пример вывода:

$ sed -n -f comapp.sed comapp.txt
en
ru
...