首页 > 解决方案 > 在正则表达式捕获组中,排除一个单词

问题描述

我有这种类型的网址:

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)\/

Rubular 链接:https ://rubular.com/r/NnojSgQK7EuelE

标签: regexregex-negation

解决方案


如果您需要一个普通的正则表达式,您可以使用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]

推荐阅读