【问题标题】:JS Regex: Parse urls with conditionsJS 正则表达式:使用条件解析 url
【发布时间】:2017-02-02 09:02:15
【问题描述】:

我需要解析一组 url 并在特殊条件下从 url 中提取特定元素。为了进一步解释,考虑一组 url:

http://www.example.com/appName1/some/extra/parts/keyword/rest/of/the/url http://www.somewebsite.com/appName2/some/extra/parts/keyword/rest/of/the/url http://www.someothersite.com/appname3/rest/of/the/url

如您所见,有两组网址,一组包含“关键字”一词,另一组则没有。在我的代码中,我会收到域名后的部分url (例如:/appName1/some/extra/parts/keyword/rest/of/the/url)

我有两个任务,一个是检查 url 中是否存在单词“keyword”,第二个是只有在 url 中不存在“keyword”时才执行,解析 url 以获取两个组作为 appName和其余的 url (例如:grp 1. appName3 和 grp 2. rest/of/the/url 用于 url 3,因为它没有“关键字”)。整个事情应该在一个正则表达式中完成。

我的进步:

  • 我能够将应用名称和 URL 的其余部分解析成组,但无法应用条件。

  • 我找到了一种选择没有“关键字”的stings的方法,我不确定这是否是正确的方法:^((?!.\*keyword).\*)$

  • 接下来,为了结合以上两个,我尝试了一个经过长时间搜索后找到的东西,它的语法是(?(?=regex)then|else)Reference。结果是:
    (?(?=^((?!.*keyword).*)$)\1)
    但是它说无效的组结构。

我已经阅读了许多 stackoverflow 条目和教程,但无法达到实际要求。请帮我解决这个问题。

【问题讨论】:

  • “我有两个任务”什么是第二个任务?
  • 根据第一个任务的结果对组件进行分组(过滤不带关键字的 url)。抱歉不清楚,我已经编辑了我的问题。
  • 如果“关键字”在字符串中什么都不做?
  • 是的,完全忽略它。
  • 不确定是否可以使用单个RegExp

标签: javascript regex regex-negation regex-lookarounds


【解决方案1】:

是的,这实际上是可能的。据我了解,您有以下几种情况:

  • /appName/some/extra/parts/keyword/rest/of/the/url
  • /appName/rest/of/the/url

您希望您的正则表达式与第一个完全不匹配,而在第二种情况下,您希望一组中的“appName”和另一组中的“rest/of/the/url”。以下正则表达式将执行此操作:

^(?!.*\/keyword\/)\/(.*?)\/(.*)$

解释:

  • ^ 断言字符串开头的位置`
  • (?!.*\/keyword\/) 是一个否定的前瞻,并前瞻以确保字符串不包含 /keyword/。这就是神奇发生的地方
  • \/ 匹配“/”,即域名后面的斜线
  • (.*?)\/ 贪婪地捕获第一组(在您的示例中为 appname),直到下一个斜杠
  • (.*)$ 是捕获“rest/of/the/url”的组

【讨论】:

  • 嗨@Mathias-S,我试过这个,但它似乎返回组,即使其中有“关键字”。我不确定要求是否明确。如果 URL 中存在“关键字”,则不应返回任何组。
  • 所以如果关键字存在,您想要获取整个 URL,如果不存在,您想要组?或者如果关键字存在,你什么都不想要?
  • 如果关键字存在,我什么都不想要,如果它不存在,组
  • 那么你只需要使用负前瞻。我已经使用执行此操作的正则表达式更新了我的答案。这能解决您的问题吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 2011-03-20
  • 1970-01-01
  • 2014-08-12
  • 2014-05-16
  • 1970-01-01
相关资源
最近更新 更多