正则表达式中字符串匹配

我需要提取出一些特定的URL,在写正则时碰到一个问题:
URL样例:

127.0.0.1 - - [14/Jul/2016:10:10:18 +0800] "GET /webshell/webshellSample-master/PHP/dama/0da3e2aa1745a397921ef9c7dcc72d6e.php?y=C:\\AppServ\\www\\webshell\\webshellSample-master\\PHP\\dama\\&x=upload HTTP/1.1" 200 5867
127.0.0.1 - - [14/Jul/2016:10:10:28 +0800] "GET /webshell/webshellSample-master/PHP/dama/0da3e2aa1745a397921ef9c7dcc72d6e.php?y=C:\\AppServ\\www\\webshell\\webshellSample-master\\PHP\\dama\\&x=mail HTTP/1.1" 200 4984

我写的正则表达式为(.*)/0da3e2aa1745a397921ef9c7dcc72d6e.php?(.*)&x=[upload|mail]
匹配结果:

127.0.0.1 - - [14/Jul/2016:10:10:18 +0800] "GET /webshell/webshellSample-master/PHP/dama/0da3e2aa1745a397921ef9c7dcc72d6e.php?y=C:\\AppServ\\www\\webshell\\webshellSample-master\\PHP\\dama\\&x=u
127.0.0.1 - - [14/Jul/2016:10:10:28 +0800] "GET /webshell/webshellSample-master/PHP/dama/0da3e2aa1745a397921ef9c7dcc72d6e.php?y=C:\\AppServ\\www\\webshell\\webshellSample-master\\PHP\\dama\\&x=m

后来正则表达式改为:(.*)/0da3e2aa1745a397921ef9c7dcc72d6e.php?(.*)&x=[upload|mail](.*)就能匹配出想要的结果

127.0.0.1 - - [14/Jul/2016:10:10:18 +0800] "GET /webshell/webshellSample-master/PHP/dama/0da3e2aa1745a397921ef9c7dcc72d6e.php?y=C:\\AppServ\\www\\webshell\\webshellSample-master\\PHP\\dama\\&x=upload HTTP/1.1" 200 5867
127.0.0.1 - - [14/Jul/2016:10:10:28 +0800] "GET /webshell/webshellSample-master/PHP/dama/0da3e2aa1745a397921ef9c7dcc72d6e.php?y=C:\\AppServ\\www\\webshell\\webshellSample-master\\PHP\\dama\\&x=mail HTTP/1.1" 200 4984

很疑惑为什么第一个正则表达式只匹配[|]格式中的第一个首字母

阅读 4.1k
3 个回答

原因是[upload|mail]
不是匹配uploadmail

而是匹配u, p, l, o, a, d, |, m, a, il中的一个即可

想达到你原来的效果可以改为括号

(.*)/0da3e2aa1745a397921ef9c7dcc72d6e.php?(.*)&x=(upload|mail)

[ ]是字符集合匹配,比如[xyz]只匹配x,y,z其中一个。
把[ ]改成( )就对了

补充点儿东西
在方括号中 [],的正则有如下的改变

  1. ^ 作为第一个字符具有特殊意义

  2. - 只有其前后都有字符才有特殊意义([-a],[a-],[a-z-A],都会匹配"-",当然如果要写-写为[a-z\-A]更好一些)

  3. 保留字符仅剩 \-]

  4. 不能使用 \B 和捕获的值 \编号

  5. \b 匹配 "\x08"(退格)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进