【问题标题】:Regex for capturng all urls with a "/" at the end apart from "/cms/"正则表达式用于捕获除“/cms/”之外最后带有“/”的所有 url
【发布时间】:2017-08-09 02:59:02
【问题描述】:

我想捕获除“/cms/”之外的所有带有“/”的网址

我目前有这个,但它不正确。 我真的不擅长正则表达式

(.*[^\/cms\/])\/$

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

如果我这样做:

(.*[^cms\/])\/$

它可以工作,除非 url 有 /blahcms/ - 此时它应该再次捕获它,这就是为什么我也尝试在开头也包含一个“/”。

我想获取的示例网址:

  • 示例/hitherecms/
  • 示例/bingbangboomcms/

我不想捕获的示例网址:

  • 示例/cms/
  • 示例/cms
  • 例子/bingbangboom

此正则表达式将在 Web.config 重写规则中使用。

【问题讨论】:

  • 它是什么语言?使用lookbehind很简单,使用JS有点复杂(不支持lookbehind)。
  • 你能发布一些典型的网址吗?
  • 如果你能提供一些 URL 示例,这会更容易。
  • @JosephGarrone,@ RomanPerekhrest - 谢谢大家,我现在已经这样做了 :)

标签: regex


【解决方案1】:

您的方法有问题,因为如果 smc 或反斜杠在结束反斜杠之前,它与字符串不匹配。使用字符类代替负前瞻通常是错误的。

用不支持负向回溯的语言解决这个问题的一种可能方法(JavaScript 是一个突出的例子):

^(?:(?!\/cms\/$).)*\/$

...或(似乎性能更高):

(?:(?!\/cms).{4}|^.{0,3})\/$

Demo

不过,与消极的后视有关是微不足道的:

^.*(?<!\/cms)\/$

Demo。请注意正则表达式风味的变化。如果只需要测试,不需要匹配,可以跳过^.*部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多