【问题标题】:Multiple nested group with single regex pattern具有单个正则表达式模式的多个嵌套组
【发布时间】:2020-06-09 21:52:32
【问题描述】:

你好
我正在尝试创建一个正则表达式来格式化发送给玩家的消息,在这种情况下是在 Minecraft 中。
对于那些熟悉 Minecraft 的人,API 会知道 TextComponent,带有悬停事件和可点击消息。
但是对于这个问题,任何关于 Minecraft 的知识都是无关紧要的,因为我只询问正则表达式组。

我有一个处理程序,它基于字符串构建消息。
用户可以选择使用类似 HTML 的标签来创建非常可定制的消息,当鼠标悬停在它们上方时会显示一些文本,并在单击时执行操作。

我有以下两个基本标签:

<hover action="The text that shows when hovered">The message sent in the chat</hover>
<click type="command" action="The command run when clicked">The message sent in the chat</click>

两个标签中的action可以完全自定义。
点击代码中的type 可以是:commandsuggesturl
但是可能支持更多标签,因此我使用type="(.*?)"

捕获它

示例字符串

// Simple string. One hover for entire message, and individual click actions
<hover action="Click on either [Accept] or [Deny] to answer the duel">Click here to answer the duel: <click type="command" action="/duel accept">[Accept]</click> <click type="command" action="/duel deny">[Deny]</click></hover>

// More advanced string. There is 3 different hover events, and still the 2 click events
<hover action="Click on either [Accept] or [Deny] to answer the duel">Click here to answer the duel:</hover> <click type="command" action="/duel accept"><hover action="Click here to accept">[Accept]</hover></click> <click type="command" action="/duel deny"><hover action="Click here to deny">[Deny]</hover></click>

目前我可以使用以下两个正则表达式分别捕获 hoverclick

// Capture the click groups
(?i)<click type="(.*?)" action="(.*?)">(.*?)<\/click>

// Capture the hover groups
(?i)<hover action="(.*?)">(.*?)<\/hover>

Click regex example (regex101.com)
Hover regex example (regex101.com)
这两个正则表达式完美地捕捉了一切。
我遇到的问题是我需要将它们放在一个正则表达式中,支持嵌套组。
如果我们采用第一个示例字符串,它应该捕获整个悬停事件,以及两个点击事件。
与第二个字符串相同。我需要它来捕获所有三个悬停和两个单击事件。 这些组应该按照它们出现的顺序被捕获,如下所示

// String 1
Match 1: Hover
Match 2: Click
Match 3: Click

//String 2
Match 1: Hover
Match 2: Click
Match 3: Hover
Match 4: Click
Match 5: Hover

我尝试将两个正则表达式与一个简单的或运算符 (|) 放在一起,如下所示:
(?i)(&lt;hover action="(.*?)"&gt;(.*?)&lt;\/hover&gt;|&lt;click type="(.*?)" action="(.*?)"&gt;(.*?)&lt;\/click&gt;)
然而,这只在第一个字符串中返回hover,在第二个字符串中返回hoverclickclick,这意味着它不会获得嵌套的捕获组。

有什么办法吗?

【问题讨论】:

  • 正在尝试构建多级嵌套的结构?
  • 对于线性自上而下并且不关心嵌套只匹配 打开标签,哇关心亲密关系
  • > 正在尝试构建多级嵌套结构? @Edward对于hower和click事件,可以有多级嵌套。单个事件不应嵌套,因此hover 事件应在新事件开始之前结束,但click 事件内部可以有click 事件@ 事件。 click事件也是一样,里面可以有hover多个hover事件,但不能有其他click事件-----> 为什么要关心关闭标签 所以我知道在哪里结束悬停事件,确保消息的其余部分没有事件(与单击相同)
  • k,所以想匹配 click +many hovers 或 hover +many clicks ,是吗?
  • 是的,两者都是。顺序是未知的,用户可以随心所欲。 :)

标签: regex


【解决方案1】:

试试(&lt;click(?=\s)[^&gt;]*?&gt;(?:(?!&lt;click(?=\s))[\S\s])*?&lt;/click\s*&gt;)|(&lt;hover(?=\s)[^&gt;]*?&gt;(?:(?!&lt;hover(?=\s))[\S\s])*?&lt;/hover\s*&gt;)

demo

特点:

  • 第 1 组匹配有一个点击块
  • 第 2 组比赛有一个悬停块
  • 不允许嵌套相同的块标签,即。点击点击/点击/点击等...

【讨论】:

  • 不幸的是,这并没有得到嵌套的内部组。在第一个字符串中,我得到了整个内容,因为它完全被悬停包围,而不是一个组中的悬停,以及另外两个组中的悬停-
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多