【问题标题】:Regex for matching different URL用于匹配不同 URL 的正则表达式
【发布时间】:2011-06-26 15:30:15
【问题描述】:

我正在尝试为 URL 匹配编写正则表达式,但它不起作用。

主题网址是...

var subject = "http://encore.lsbu.ac.uk/iii/encore/search/C%257CSab%257COrightresult%257CU1?lang=eng&suite=pearl";

正则表达式是...

var regex = /http:\/\/encore.lsbu.ac.uk\/iii\/encore\/search\/C%257CS[a-z][A-Z][0-9]%257COrightresult%257CU1?lang=eng&suite=pearl/i;

我正在使用 JavaScript 对其进行测试。

var answer = regex.test(subject);
// answer is false

目标是匹配任何带有正则表达式的 URL,该正则表达式在字符串中间更改了关键字,但整个字符串与 URL 匹配。换句话说,除了不检查关键字部分之外,两个字符串都应该匹配。我做错什么了吗?

【问题讨论】:

  • [a-z][A-Z][0-9] 是一个小写字母,后跟一个大写字母,后跟一个数字。 [a-zA-Z0-9] 是它们的组合,但只有一个字符。 [a-z][A-Z][0-9]* 是零个或多个这些字符。等等等等..是时候阅读这个人了..
  • 目标是整个字符串应该被匹配,除了它的一部分应该被转义(不匹配),因为它是关键字并且它是变量。
  • 转义是什么意思??
  • 更改此部分:...C%257CS[^%]+%...
  • 在正则表达式 [a-z][A-Z][0-9] 中,这部分不应匹配,但应匹配整个字符串。 [a-z][A-Z][0-9] 这是可变的,可以是任何字符、数字或任何可以从键盘输入的内容。

标签: javascript regex


【解决方案1】:

这是固定的正则表达式:

/http:\/\/encore\.lsbu\.ac\.uk\/iii\/encore\/search\/C%257CS[a-z0-9]*%257COrightresult%257CU1\?lang=eng&suite=pearl/i

我对其进行了以下更改:

  • 用反斜杠转义 URL 中的点。
  • [a-z][A-Z][0-9] 更改为[a-z0-9]* 以匹配任何重复零次或多次的字符。
    • 您也可以使用+ 代替* 来匹配字符一次或多次,或者使用{2} 来精确匹配它们两次(在您的示例字符串中就是这种情况,但可能并非在所有情况下都如此) .
  • 用反斜杠转义 URL 中的问号。

编辑:删除了A-Z,因为它不需要(正则表达式不区分大小写)。

【讨论】:

  • 末尾的/i 使整个字符串不区分大小写,所以如果你还有a-z,你真的不需要A-Z 部分。无论如何 +1 ;-)
  • 除了这些类型的字符之外,还允许使用每种类型的字符吗?也包括特殊字符。
  • 如果你想匹配任何字符,你可以使用.而不是[a-z0-9]
【解决方案2】:

如果我理解正确,您正在尝试匹配 URL,除非您想接受任何关键字字符而不是原始字符串中的“ab”。

作为参考,[a-z][A-Z][0-9] 表示您需要一个小写字符,然后是一个大写字符,然后是一个数字。尝试使用 \w 代替,它与其中任何一个匹配。

如果您想接受任意长度的关键字,请使用 \s+。如果您想将其限制为两个字符,请尝试 \w{2,2}。

所以你的网址的相关部分是:

/C%257CS\s+%257

【讨论】:

  • @Stephen,我想你的意思是\w 匹配字母、数字和_\s 表示任何空白字符(空格、制表符、cr、lf)。
猜你喜欢
  • 2016-12-12
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多