表达式匹配分隔块内的每个参数

时间:2014-11-26 14:36:58

标签: regex

在深奥的脚本语言中,我有类似的结构:

node % % % % % ... end

'%'字符代表一个标识符,但让我们暂时离开。我想在这里做的就是匹配每个'%',仅此而已。

在文本术语中:让我们匹配“节点”和“结束”分隔符之间的每个百分比。

我的猜测是:

(?<=node )(?:(?<= )%)+(?= end)

但不,它只匹配

中的单个'%'
node % end

任何线索?

注意:语言是C#。所以“\ K”不起作用。重要条件 - 我需要纯匹配,我不能使用捕获组。这是解析器的限制,但如果没有捕获组就无法完成,我将被强制覆盖内置解析器并编写自己的解析器,但我仍然希望以某种方式避免它。

我需要这个表达式来显示编辑器中参数编号的提示。当您将鼠标光标放在“node ... end”编辑器中的第三个表达式时,将显示提示“P3”。实际代码将使用正则表达式匹配标识符“[^; \ r \ n] +”替换%,并使用“[; \ r \ n] +”替换空格。如果在没有使用捕获组的情况下无法在C#中完成,我只需要添加几行代码来手动选择提示范围。但它不会像单个正则表达式那样酷:)

3 个答案:

答案 0 :(得分:1)

更改您的正则表达式,如下所示,以匹配%node之间的所有end

(?:node|(?<!^)\G)[^%]*\K%(?=.*?end)

DEMO

答案 1 :(得分:1)

我估计这不会有最佳性能,但除非你能提供更好的约束,否则你必须使用2 .*个通配符(确保.与新行不匹配) :

(?<=node.*)%(?=.*end)

编辑:根据http://www.regular-expressions.info/lookaround.html#limitbehind,.NET支持无限重复的后备,即使上面的正则表达式不是有效的PCRE(它会导致错误&#34; Lookbehinds需要为零宽度,因此不允许使用量词(&#34; )。

答案 2 :(得分:0)

将视线放在(?<= )

后面

正则表达式可以

(?<=node)( %)+(?= end)

示例:http://regex101.com/r/jI6iP3/1