0

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

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

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?=.][\/$]+)

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

4

2 回答 2

0

这应该可以解决问题:

/\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标志用于不区分大小写。

于 2013-03-11T10:32:59.140 回答
0

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

^[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";
  }
}
于 2013-03-11T10:39:55.440 回答