Javascript REGEX匹配多个自定义标记(也不完整)

时间:2016-06-15 13:21:21

标签: javascript regex

我试图匹配" custom"标签可能是完整/不完整的,如下所述。

粗体文字是我想要匹配的内容。

  1. %end {某些文字

  2. %start {一些文字

  3. %start {某些文字}%end

  4. %start {某些文字}%end%start {更多文字}%end

  5. 此外,这些标记可以在字符串中多次出现。例如,正则表达式:

    /%start(.*)%end/gi
    

    应用于第4个示例将捕获: %start { some text}%end%start {more text }%end

    我将如何继续实现前4个示例中描述的匹配?

4 个答案:

答案 0 :(得分:1)

如果您的数据可以在一行中包含多个标记,而在其他位置使用未关闭的标记,而标记内容可以包含%,则有点棘手:

使用/%(?:start|end){((?:(?!%(?:start|end){)[^}])+)/g并检索第一组。

这是regex101 test

请注意,它比接下来的两个表达式贵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)

你可以尝试使用这个:

/{([a-z0-9 ]*)}/gi

你可以在那里看到结果: https://regex101.com/r/uY8jE5/1