【发布时间】: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 可以是:command、suggest 和url。
但是可能支持更多标签,因此我使用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>
目前我可以使用以下两个正则表达式分别捕获 hover 和 click 组
// 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)(<hover action="(.*?)">(.*?)<\/hover>|<click type="(.*?)" action="(.*?)">(.*?)<\/click>)
然而,这只在第一个字符串中返回hover,在第二个字符串中返回hover、click、click,这意味着它不会获得嵌套的捕获组。
有什么办法吗?
【问题讨论】:
-
正在尝试构建多级嵌套的结构?
-
对于线性自上而下并且不关心嵌套只匹配
或 打开标签,哇关心亲密关系 -
> 正在尝试构建多级嵌套结构? @Edward对于hower和click事件,可以有多级嵌套。单个事件不应嵌套,因此
hover事件应在新事件开始之前结束,但click事件内部可以有click事件@ 事件。click事件也是一样,里面可以有hover多个hover事件,但不能有其他click事件-----> 为什么要关心关闭标签 所以我知道在哪里结束悬停事件,确保消息的其余部分没有事件(与单击相同) -
k,所以想匹配 click +many hovers 或 hover +many clicks ,是吗?
-
是的,两者都是。顺序是未知的,用户可以随心所欲。 :)
标签: regex