【问题标题】:Find a string that contains X but not Y查找包含 X 但不包含 Y 的字符串
【发布时间】:2018-09-06 17:49:17
【问题描述】:

我想对 url 执行正则表达式操作。我的网站上有这两条路线:

  • domain.tld/clermont-ferrand/63000-cedex-01/
  • domain.tld/clermont-ferrand/63000-cedex-01/in-a-25-km-radius/

我正在使用正则表达式 [0-9a-z\-]+ 来匹配 63000-cedex-01(请注意,63000-cedex-01 可以是用连字符而不是空格格式化的任何邮政编码)。

现在当有人尝试访问这样的 url 时,问题就出现了:

domain.tld/clermont-ferrand/in-a-25-km-radius/

正则表达式会认为这条路线是有效的,这是我不想要的。

是否可以告诉正则表达式搜索不包含“in-a-25-km-radius”的连字符分隔的字母数字模式。

我尝试了这两个正则表达式,但它们不起作用:

  • ((?!in-a-\d+-(km|mile|miles)-radius)|[0-9a-z\-]+)
  • (?(?=[0-9a-z\-]+)([0-9a-z\-]+)|(in-a-\d+-(km|mile|miles)-radius))

编辑

基本上在我的 MVC 框架的路由文件中,我有这两条路由:

/event/{status:(ongoing|past|upcoming)}/{category_slug:[az-]+}-event/in/{city_slug:[az-]+}/{postal_code_slug:[0-9a- z-]+}/

匹配如下路径:

/event/ongoing/music-event/in/clermont-ferrand/63000-cedex-01/

和

/event/{status:(ongoing|past|upcoming)}/{category_slug:[az-]+}-event/in/{city_slug:[az-]+}/{postal_code_slug:[0-9a- z-]+}/in-a-{radius:\d+}-{unit:(km|mile|miles)}-radius/

匹配如下路径:

/event/upcoming/film-event/in/beverly-hills/90210/in-a-40-miles-radius/

不幸的是,第一条路线也匹配:

/event/past/manga-and-anime-event/in/montreal/in-a-200-km-radius/

编辑

正则表达式应该匹配如下字符串:

  • 9600

  • ax-85000

  • ad327

  • 36505-962

  • biqq-1zz

  • gx11-1aa

和 not 匹配如下字符串:

  • 在 200 公里半径内

  • 1 英里半径内

  • 半径 85 英里

【问题讨论】:

  • 如何将63000-cedex-01 与[a-z\-]+ 匹配?是不可能的。你真正的正则表达式是什么?显示使用它的代码,并解释每个提供的输入需要得到什么结果。
  • 你是对的。我修好了!
  • 你什么都没解决。
  • 你知道你的最大半径是多少。而且您知道邮政编码的可能长度。你为什么用+?

标签: php regex pcre


【解决方案1】:

是否可以告诉正则表达式搜索一个连字符分隔 不包含“in-a-25-km-radius”的字母数字模式。

试试这个:

\A(?!in-a-25-km-radius)[\w-]++

【讨论】:

  • 它与连字符分隔的字母数字模式不匹配。事实上,据我所知,它不匹配任何东西
  • 可能会发生一些误会。
  • PCRE 使用“主题字符串”、“模式”和“匹配”终端进行操作。显示需要匹配的确切主题字符串,而不是显示需要不匹配的确切主题字符串。之后我可以写一个模式。您以前的帖子不包含确切的主题字符串。
  • 试试^(?!in-a-\d++-(?>km|miles?+)-radius)[\w-]++你可以确保它在regex101.com/r/XyVXRT/1工作
猜你喜欢
  • 2011-01-10
  • 2010-11-29
  • 2018-07-08
  • 2020-09-01
  • 2016-05-06
  • 1970-01-01
  • 2019-04-22
  • 2020-05-26
  • 2014-03-23
相关资源
最近更新 更多