我试图匹配" custom"标签可能是完整/不完整的,如下所述。
粗体文字是我想要匹配的内容。
%end {某些文字
%start {一些文字
%start {某些文字}%end
%start {某些文字}%end%start {更多文字}%end
此外,这些标记可以在字符串中多次出现。例如,正则表达式:
/%start(.*)%end/gi
应用于第4个示例将捕获: %start { some text}%end%start {more text }%end
我将如何继续实现前4个示例中描述的匹配?
答案 0 :(得分:1)
如果您的数据可以在一行中包含多个标记,而在其他位置使用未关闭的标记,而标记内容可以包含%
,则有点棘手:
使用/%(?:start|end){((?:(?!%(?:start|end){)[^}])+)/g
并检索第一组。
请注意,它比接下来的两个表达式贵3倍,需要112步才能匹配您的第四个数据示例,而其他两个只需要34步。
如果您的数据可以在一行中包含多个标记,而在其他位置使用未关闭的标记,但标记内容不能包含%
,那么它已经轻松了很多:
使用/%(?:start|end){([^}%]+)/g
并检索第一组。
这是regex101 test。注意它在最后一个数据集上是如何失败的。
如果您的数据不能包含不在最后一个位置的其他位置的未关闭标签,则更容易:
使用/%(?:start|end){([^}]+)/g
并检索第一组。
这是regex101 test。请注意,如果一次解析多行,则需要向否定类添加换行符,以及它在最后两个数据集上的失败方式。
答案 1 :(得分:1)
您可以使用此模式:
/%start([^%]*(?:%(?!end)[^%]*)*)(?:%end)?/gi
我们的想法是以贪婪的方式描述内容,使其与结束标记不匹配,并使结束标记可选。
[^%]* # all that is not a %
(?:
%(?!end) # a % not followed by "end"
[^%]*
)*
答案 2 :(得分:1)
我认为第一个标记无效,因为它没有%start
,如果省略%end
而不是标记在最后一个单词结束。
所以正则表达式是(example):%start{([a-z0-9\s]+)}?
答案 3 :(得分:0)