正则表达式:匹配,直到找到第一个字符

时间:2011-12-22 10:10:13

标签: regex

我正在努力匹配,直到第一次出现]被发现但似乎无法使其发挥作用,如果有人可以帮我解决这个问题。

我正在匹配的字符串:

[plugin:tabs][tab title="test"]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet nisl nisl. Ut interdum libero vitae quam ultricies et lacinia elit aliquet. Praesent tincidunt, sem tempus feugiat feugiat, turpis tellus scelerisque erat, sit amet feugiat neque arcu ac lectus. Sed at mi et elit interdum scelerisque vitae eu felis.[/tab][/plugin]

应该匹配的内容:

[plugin:tabs]

它保持匹配:

[plugin:tabs][tab title="test"]

正则表达式:

(\[plugin:(?<identifier>[^\s]+)(?<parameters>.*?)\])

编辑: 它应该匹配的内容:

[plugin:tabs test="test"]

3 个答案:

答案 0 :(得分:2)

您只需要像这样添加?(懒惰匹配,将匹配尽可能少的字符):

(\[plugin:(?<identifier>[^\s]+?)(?<parameters>.*?)\])
                              ^

虽然(?<parameters>.*?)部分是不必要的。

所以你的最终正则表达式会是这样的:

(\[plugin:(?<identifier>[^\s]+?)\])

€dit:请参阅@ stema的答案。

答案 1 :(得分:1)

在这里试试

(\[plugin:(?<identifier>[^\]\s]+)(?<parameters>.*?)\])

here on Regexr

除了空白字符外,还避免了第一个命名组中的]字符。

如果您不需要第一个捕获组,可以通过在左括号后添加?:使其成为非捕获组。

(?:\[plugin:(?<identifier>[^\]\s]+)(?<parameters>.*?)\])

为避免第二组捕获其间的空间,只需匹配两组之间的可选空格

(?:\[plugin:(?<identifier>[^\]\s]+)\s*(?<parameters>.*?)\])

here on Regexr

答案 2 :(得分:0)

使用支持lookbehinds的任何语言,这将是您最简单的解决方案。

/(^(?<!])*)/