【问题标题】:Regex to match alphanumerics, URL operators except forward slashes正则表达式匹配字母数字、URL 运算符(正斜杠除外)
【发布时间】:2013-03-11 19:25:51
【问题描述】:

在过去的几个小时里,我一直在努力让这个正则表达式正确,但不幸的是,我仍然无法得到它。也尝试搜索现有线程,但没有骰子。 :(

我想要一个正则表达式来匹配以下可能的字符串:

userprofile?id=123
profile
search?type=player&gender=male
someotherpage.htm

但不是

userprofile/
helloworld/123

基本上,我希望正则表达式匹配 字母数字URL 运算符,例如 ?、= 和 &,但 不匹配正斜杠。 (即只要字符串包含正斜杠,正则表达式应该只返回 0 个匹配项。)

我已经尝试了以下正则表达式,但似乎都不起作用:

([0-9a-z?=.]+)
(^[^\/]*$[0-9a-z?=.]+)
([0-9a-z?=.][^\/]+)
([0-9a-z?=.][\/$]+)

任何帮助将不胜感激。非常感谢!

【问题讨论】:

  • 所以,您只是不想匹配字符串中的正斜杠,而其他所有内容都应该匹配?是这样吗?或者就像,不应该匹配 - "userprofile" 之后的正斜杠?
  • 语言是什么?我建议您使用 URI/URL 类对 URL 进行预处理,以便在验证之前将 URL 拆分。
  • 嘿@RohitJain,感谢您的回复!为了清楚起见,我只是编辑了我的问题。只要字符串包含正斜杠,正则表达式就应该返回 0 个匹配项。但它可能包含字母数字和 URL 运算符,例如 ?、= 和 &。 (:
  • @nhahtdh 此正则表达式用于 XML 文档(Struts 2 的 URL 重写)。

标签: regex url-rewriting


【解决方案1】:

它们都匹配的原因是您的正则表达式匹配字符串的一部分,而您没有告诉它它需要匹配整个字符串。您需要确保它不允许字符串中的任何其他字符,例如

^[0-9a-z&?=.]+$

这是一个小 perl 脚本来测试它:

#!/usr/bin/perl

my @testlines = (
         "userprofile?id=123",
         "userprofile",
         "userprofile?type=player&gender=male",
         "userprofile.htm",
         "userprofile/",
         "userprofile/123",
        );

foreach my $testline(@testlines) {
  if ($testline =~ /^[0-9a-z&?=.]+$/) {
    print "$testline matches\n";
  } else {
    print "$testline doesn't match - bad regexp, no cookie\n";
  }
}

【讨论】:

  • 这非常有效。太感谢了!因为这是针对 XML 文档的,所以我稍作修改以转义 & 符号,如下所示:^[0-9a-z&?=.]+$
【解决方案2】:

这应该可以解决问题:

/\w+(\.htm|\?\w+=\w*(&\w+=\w*)*)?$/i

分解:

\w+              // Match [a-z0-9_] (1 or more), to specify resource
  (              // Alternation group (i.e., a OR b)
    \.htm        // Match ".htm"
    |            // OR
    \?           // Match "?"
    \w+=\w*      // Match first term of query string (e.g., something=foo)
    (&\w+=\w*)*  // Match remaining terms of query string (zero or more)
  )
?                // Make alternation group optional
$                // Anchor to end of string

i 标志用于不区分大小写。

【讨论】:

  • 对不起@Xophmeister,我的问题不太清楚。为了清楚起见,只是对其进行了进一步编辑。前面的字符串不必总是'userprofile'。正则表达式应返回字母数字和 URL 运算符(例如 ?、= 和 &)的匹配项。但只要字符串包含正斜杠,它就不应该返回任何匹配项!感谢您的帮助!
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2012-11-22
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2013-05-15
相关资源
最近更新 更多