1

我知道很多人都发布了类似的问题,但是有了这个g标志,似乎没有一个“黑客”对我有用(这意味着它们大部分时间都不起作用)是的,我想要g旗帜我所做的正则表达式是:

\~\![A-Za-z]+\ start(?:(?:(?:\(|,)\ ?[\w]+)*?\))\:\{([\S\s]+?)(?:(?<!\\)\}\:end)

当支持负后视时,这可以正常工作。但是当我用 JavaScript 做的时候。它不支持负面的看法。这是问题所在的部分:

(?:(?<!\\)\}\:end)

它应该匹配什么

\}:end    <- Not this
}:end     <- This
foo}:end  <- This

我试过了:

4

2 回答 2

2

而不是使用lookbehind,您可以使用lookahead

例如

abcdefg;}hijklmn#}

要得到

$1 = `abcdefg;}hijklmn`
$2 = `#}`

使用lookbehind方法你可以做

(.*)(?<!#})(#})

请参阅:DEMO(后视方法)

这里#}通过使用否定的lookbehind来防止重复。

另一方面,通过“产生前瞻”也可以实现前瞻方法,

让我们考虑我们的示例文本

abcdefg;}hijklmn#}

变得

%a%b%c%d%e%f%g%;%}%h%i%j%k%l%m%n%#}

这里%s 代表向前看。

我们怎样才能产生这样的前瞻?

让我们为示例文本考虑前瞻方法正则表达式

((?:(?!#}).)*)(#})

参见:DEMO(前瞻方法)

这里的一个技巧是产生前瞻以及.正则表达式((?:(?!#}).)*)可以扩展到的位置

((?!#}).(?!#}).(?!#}).(?!#}).(?!#}).(?!#}).) and so on

这意味着它将检查每个字母以保证您没有#}in (.*)

因此,如果将此策略应用于您的正则表达式,您将获得

\~\![A-Za-z]+\ start(?:(?:(?:\(|,)\ ?[\w]+)*?\))\:\{((?:(?!\}\:end\n)[\S\s])+)(?:\}\:end)

见:演示

于 2015-08-30T20:31:09.180 回答
1
\~\![A-Za-z]+\ start(?:(?:(?:\(|,)\ ?[\w]+)*?\))\:\{([\S\s]+?)(?:[^\\]\}\:end)

试试这个,看演示:

https://regex101.com/r/uE3cC4/17

于 2015-05-02T18:28:42.433 回答