2013-05-02 135 views
-1

我有一个字符串,它看起来像这样:正则表达式匹配的是数字,而不是字母

[IF-ABC] 12345 [IF-DEF] 67890 [/ IF] [/ IF]

我有以下的正则表达式:

/\[if-([a-z0-9-]*)\]([^\[if]*?)\[\/if\]/s 

此相匹配的内部支架,就像我想它。但是,当我用文本替换67890(即。abcdef)时,它与它不匹配。

[如果-ABC] 12345 [如果清晰度] ABCDEF [/如果] [/如果]

我希望能够匹配任何字符,包括换行,除另一个开口支架[if-

+0

不写“我”或者是“F”一文中,它会工作。你的正则表达式有一个错误 – DhruvPathak 2013-05-02 19:49:14

回答

1

像你想象的那样这部分不工作:

[^\[if] 

这将匹配单个字符,既不的[if。无论何种组合。您可以使用negative lookahead虽然模仿所需的行为:

~\[if-([a-z0-9-]*)\]((?:(?!\[/?if).)*)\[/if\]~s 

我还包含在先行结束标签,因为这避免了重复ungreedy(通常是糟糕的性能代价)。另外,我更改了分隔符,这样你就不必在模式中逃避斜线。

所以这是最有趣的部分((?:(?!\[/?if).)*)解释说:

(  # capture the contents of the tag-pair 
    (?:  # start a non-capturing group (the ?: are just a performance 
      # optimization). this group represents a single "allowed" character 
    (?! # negative lookahead - makes sure that the next character does not mark 
      # the start of either [if or [/if (the negative lookahead will cause 
      # the entire pattern to fail if its contents match) 
     \[/?if 
      # match [if or [/if 
    )  # end of lookahead 
    .  # consume/match any single character 
)*  # end of group - repeat 0 or more times 
)   # end of capturing group 
+0

您的功能有效,谢谢..也感谢您的解释,我将不得不经过几次才能得到它 – user2103849 2013-05-02 20:18:38

-1

使用句点来匹配任何字符。

+1

使用一段时间,为什么使用一段时间 - 它有什么作用?这将如何改变? – 2013-05-02 19:56:57

+0

仔细阅读我的评论。 “用一段时间来匹配任何角色”。所以,根据你的问题“我想匹配任何角色”,你会使用一段时间“。”匹配任何字符。虽然根据您的评论,我强烈建议您回去阅读相应的正则表达式手册。 – Chad 2013-05-03 00:01:44

+0

我在发表评论以备份我应用于答案的downvote。 “使用一段时间来匹配任何角色”几乎不能解决所提出的问题,而只能处理帖子中的一小部分文字。 – 2013-05-03 04:20:09

0

修改一点点结果:

/\[if-([a-z0-9-]+)\](.+?)(?=\[if)/s 

上运行它[if-abc] 12345 [if-def] abcdef [/if][/if]

结果在第一场比赛为:[if-abc] 12345

你的组是:abc12345

和修改更进一步:

/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s 

与两组相匹配。尽管分号[/if]未被其中任何一个捕获。

注:取而代之的匹配定界符我在正则表达式中使用一个超前((?=))停止当文本的前瞻未来相匹配。

+0

我认为目标是只匹配内部对,而不是外部或两者。 – 2013-05-02 19:55:43

+0

@ m.buettner为什么只匹配一个正则表达式,当你可以匹配多个?他有一个以上的字符串,所以需要在某个时候匹配。 – 2013-05-02 19:57:47

+0

这是一个嵌套结构......所以匹配'[if-abc] 12345'似乎对我来说是一个不完整/无用的匹配。由于在正则表达式中计算嵌套级别是不可能的,因此只匹配最内层的对(可以用其他方式替换以便能够重复该过程并从内到外工作)是有意义的。另外,这只是OP在问题中指定的内容。 – 2013-05-02 20:02:12

相关问题