-1

我有一个看起来像这样的字符串:

[if-abc] 12345 [if-def] 67890 [/if][/if]

我有以下正则表达式:

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

这就像我想要的那样匹配内括号。但是,当我用文本(即 abcdef)替换 67890 时,它不匹配。

[if-abc] 12345 [if-def] abcdef [/if][/if]

我希望能够匹配任何字符,包括换行符,除了另一个左括号[if-

4

3 回答 3

1

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

[^\[if]

这将匹配既不是[,i或的单个字符f。不管组合。不过,您可以使用负前瞻来模仿所需的行为:

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

我还在前瞻中包含了结束标签,因为这样可以避免不贪婪的重复(这通常会导致性能更差)。另外,我更改了分隔符,这样您就不必转义模式中的斜线。

所以这是((?:(?!\[/?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
于 2013-05-02T19:54:43.693 回答
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]这些中的任何一个都没有捕获分隔符。

注意:当前面的文本与前瞻匹配时,我在正则表达式中使用前瞻 ( (?=)) 来停止匹配分隔符,而不是匹配分隔符。

于 2013-05-02T19:52:28.927 回答
-1

使用句点匹配任何字符。

于 2013-05-02T19:44:21.893 回答