我有这样的判决:
\[code(?:=(["']?)(.{0,50}?)\1)?\](?!\s*\[\/code\])(.*?)\[\/code\]这个regex应该支持:
[code]content[/code]
[code=Title]content[/code]
[code="Title"]content[/code]
[code='Title']content[/code]不允许使用空内容[code][/code],这要归功于:
(?!\s*\[\/code\])此外,不允许带有标题[code=Title][/code]的空内容,而且上面的非捕获组也在为该条件工作,直到我不将两个标记插入到一起:
[code="title"][/code]
[code][/code]我怎么能不让最后一个条件与正则表达式匹配呢?
最好在这里观察到这个问题:https://regex101.com/r/J1dwJa/2/
据我所知,它所造成的问题是正则表达式的这一部分:
(["']?)我使用量词来支持模式[code=Title][/code]。至少我认为,这个正则表达式需要的是,当它遇到]时,应该停止,不要继续。我正在尝试,但我没有找到任何途径,我的基本准则知识。
发布于 2019-06-18 06:40:00
你应该关心两件事:
.比需要的要匹配得多[/code]时,不应该在内容部分与[/code]匹配\[code(?>=(["']?)([^][]*)\1)?](?:(?!\s*(\[\/code])).)+(?3)请参阅现场演示
发布于 2019-06-20 01:19:13
Regex引擎不会放弃一场比赛,直到它尝试了所有的可能性。
在正则表达式中,这个序列.{0,50}?将不贪婪地匹配,从0到50个字符。
在您的regex101示例中,您已经指定了点-所有修饰符//s,这意味着您的点将跨越行。就这样,在下一行中,它可以满足(?!\s* /code )传递的主体(内容)。
您会注意到,要做到这一点,就必须在backtrakck上放弃引号,这样( ["']? )就永远不会匹配,而\1只是一个空字符串。这就为非贪婪的顺序变成贪婪敞开了大门。这是一个令人头疼的时刻。
更新
经过进一步检讨,我坚信只有一条路可走。
以满足所有条件使之成为可行的正则表达式。
这些步骤是:
[^\[\]] ),因为引号的思想是允许像[]__这样的分隔符。
这个部分必须被动地允许任何字符.__。
这将允许这样的字符串匹配
[code="t][/code]"]hello world[/code]
然而,生成这样的字符串可能是不可能的。就是这样。如果它做了任何其他方式,这是完全错误的。
我包括一个链接,显示所有可能的案件。
如果你发现一个错误..。啊,根本就没有。
第2组和第3组包含值(一个或另一个),只需连接
他们。
第4组包含内容。
(?s)\[code(?>(?:=(?:(["'])(.{0,50}?)\1|([^\]]{0,50})))?)\](?!\s*\[\/code\])(.*?)\[\/code\]https://regex101.com/r/cO73iA/1
解说
(?s) # Dot-all modifier
\[code # Open bbcode tag
(?> # Atomic group, can't be backtracked into
(?:
=
(?:
( ["'] ) # (1), Quote
( .{0,50}? ) # (2), code value
\1 # Backref to Quote
| # or,
( [^\]]{0,50} ) # (3), Un-quoted code value
)
)?
)
\]
(?! \s* \[/code\] ) # Cannot be empty content
( .*? ) # (4), Content, must be some
\[/code\] # Close bbcode tag发布于 2019-06-16 06:28:12
您可以使用以下更新的regex
\[code(?:=(["']?)([^'"]{0,50}?)\1)?\](?!\s*\[\/code\])(.*?)\[\/code\]不要使用.{0,50},而是使用匹配除"或'以外的任何字符的[^'"]{0,50}
在下面的链接中检查它的匹配
https://stackoverflow.com/questions/56616249
复制相似问题