首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不允许带有属性的BBCode标记中的空内容

问不允许带有属性的BBCode标记中的空内容
EN

Stack Overflow用户
提问于 2019-06-16 05:09:23
回答 4查看 183关注 0票数 3

我有这样的判决:

代码语言:javascript
复制
\[code(?:=(["']?)(.{0,50}?)\1)?\](?!\s*\[\/code\])(.*?)\[\/code\]

这个regex应该支持:

代码语言:javascript
复制
[code]content[/code]
[code=Title]content[/code]
[code="Title"]content[/code]
[code='Title']content[/code]

不允许使用空内容[code][/code],这要归功于:

代码语言:javascript
复制
(?!\s*\[\/code\])

此外,不允许带有标题[code=Title][/code]的空内容,而且上面的非捕获组也在为该条件工作,直到我不将两个标记插入到一起:

代码语言:javascript
复制
[code="title"][/code]
[code][/code]

我怎么能不让最后一个条件与正则表达式匹配呢?

最好在这里观察到这个问题:https://regex101.com/r/J1dwJa/2/

据我所知,它所造成的问题是正则表达式的这一部分:

代码语言:javascript
复制
(["']?)

我使用量词来支持模式[code=Title][/code]。至少我认为,这个正则表达式需要的是,当它遇到]时,应该停止,不要继续。我正在尝试,但我没有找到任何途径,我的基本准则知识。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-06-18 06:40:00

你应该关心两件事:

  1. .比需要的要匹配得多
  2. 在查找关闭的[/code]时,不应该在内容部分与[/code]匹配
代码语言:javascript
复制
\[code(?>=(["']?)([^][]*)\1)?](?:(?!\s*(\[\/code])).)+(?3)

请参阅现场演示

票数 3
EN

Stack Overflow用户

发布于 2019-06-20 01:19:13

Regex引擎不会放弃一场比赛,直到它尝试了所有的可能性。

在正则表达式中,这个序列.{0,50}?将不贪婪地匹配,从0到50个字符。

在您的regex101示例中,您已经指定了点-所有修饰符//s,这意味着您的点将跨越行。就这样,在下一行中,它可以满足(?!\s* /code )传递的主体(内容)。

您会注意到,要做到这一点,就必须在backtrakck上放弃引号,这样( ["']? )就永远不会匹配,而\1只是一个空字符串。这就为非贪婪的顺序变成贪婪敞开了大门。这是一个令人头疼的时刻。

更新

经过进一步检讨,我坚信只有一条路可走。

以满足所有条件使之成为可行的正则表达式。

这些步骤是:

  1. 将引号部分缠绕在原子群.周围 这使得比赛的这一部分不受回溯的影响。
  2. 使用替换来区分引用的值和非引用的. 把引用的部分放在第一位。 请注意,您根本不能在引用的部分中使用负类(即[^\[\]] ),因为引号的思想是允许像[]__这样的分隔符。 这个部分必须被动地允许任何字符.__。 这将允许这样的字符串匹配 [code="t][/code]"]hello world[/code] 然而,生成这样的字符串可能是不可能的。

就是这样。如果它做了任何其他方式,这是完全错误的。

我包括一个链接,显示所有可能的案件。

如果你发现一个错误..。啊,根本就没有。

第2组和第3组包含值(一个或另一个),只需连接

他们。

第4组包含内容。

代码语言:javascript
复制
(?s)\[code(?>(?:=(?:(["'])(.{0,50}?)\1|([^\]]{0,50})))?)\](?!\s*\[\/code\])(.*?)\[\/code\]

https://regex101.com/r/cO73iA/1

解说

代码语言:javascript
复制
 (?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
票数 1
EN

Stack Overflow用户

发布于 2019-06-16 06:28:12

您可以使用以下更新的regex

代码语言:javascript
复制
\[code(?:=(["']?)([^'"]{0,50}?)\1)?\](?!\s*\[\/code\])(.*?)\[\/code\]

不要使用.{0,50},而是使用匹配除"或'以外的任何字符的[^'"]{0,50}

在下面的链接中检查它的匹配

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56616249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档