2013-04-05 189 views
1

我在写perl兼容正则表达式时遇到了麻烦,以便在每个条件之间存在差距时匹配几个不同的东西。它更有意义,当我解释我希望它找到PCRE正则表达式需要帮助

条件是什么

  1. /世界/
  2. 一个字母
  3. 破折号或下划线
  4. 一个字母
  5. 单期
  6. 三个或四个字母

我遇到的问题是我不知道如何编写表达式,使得条件#1和#2之间可能存在差距。条件#2 - #4可以重复,但不总是。

我一直在使用多个在线正则表达式测试人员,但我无法获得一个匹配,我不知道我做错了什么。我认为正则表达式正在寻找/world/x_x/world/y-y,而不是“展望”来匹配“字母短划线字母”或“字母下划线字母”模式。

当前正则表达式

/world/([a-z](-|_)[a-z]){1,}\.[a-z]{3,4}$ 

期望匹配(目前不匹配)

hxxp://armassimchilzeispreu.blackjackipad.com/world/activate_available.jar 

hxxp://chubfaceddamsel0.affittobarcheavela.it/world/eternal_threat-clearing.html 

hxxp://offdestroyengarabitar.freebookofraslot.com/world/bonus-middle-marathon.pdf 
+1

您希望的匹配似乎不符合您使用的条件。你说你想要以'/ world/[单个字母] [ - 或_] [另一个单个字母]开头的字符串',但是你说你想让它匹配'/ world/activate_available.jar'。 “激活”和“可用”都比一个字符长得多。 – user1618143 2013-04-05 17:02:10

+0

另外,'eternal_threat-clearing.html'和'bonus-middle-marathon.pdf'有多个“连字符或下划线”。 – Borodin 2013-04-05 17:10:11

+0

@ user1618143 - 我说x-x或y_y,因为我只是想确保这种模式存在,我不在乎网址有多长或什么字。我知道网址有完整的字词,但我不在乎那里有什么字。我必须完整匹配单词或word_word吗? – user2249813 2013-04-05 17:11:59

回答

3

我想你想这

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    print "OK $_\n" if m</world/[a-z]+(?:[_-][a-z]+)+\.[a-z]{3,4}$>; 
} 

__DATA__ 
hxxp://armassimchilzeispreu.blackjackipad.com/world/activate_available.jar 
hxxp://chubfaceddamsel0.affittobarcheavela.it/world/eternal_threat-clearing.html 
hxxp://offdestroyengarabitar.freebookofraslot.com/world/bonus-middle-marathon.pdf 

或者只是

m</world/[a-z-_]+\.[a-z]{3,4}$> 
+0

我想这就是它!如果你不介意,你会解释你做了什么吗?我不熟悉?:(根据文档的非捕获子模式)。我想研究这个,所以我可以更好地理解它。你不知道我是如何高兴地签署了这个签名,但我确实想确保我理解它:D – user2249813 2013-04-05 17:21:53

+0

刚刚注意到你的第二个表情。那个也可以。我试图剖析它。 – user2249813 2013-04-05 17:31:32

+0

[a-z -_] + - 匹配任何字母,短划线或下划线一次或多次。有一件事,我可能是错的,但即使它没有 - 或_,这将匹配一个字符串。有没有办法让它有一个强制性的字符串? – user2249813 2013-04-05 17:36:24