gpt4 book ai didi

javascript - 仅当有外支撑时才选择内支撑

转载 作者:行者123 更新时间:2023-11-28 19:03:56 24 4
gpt4 key购买 nike

这是我的文字:

This [is] some [d[um]my] text. How to [se[le]ct i[nn]er b]race wi[th[out s]ele[ct]ing th]e outer b[race [in] a tex]t

上述文本所需的正则表达式必须突出显示如下

This [is] s[o]me [d[um]my] text. How to [se[le]ct i[nn]er b]race wi[th[out s]ele[ct]ing th]e outer b[race [in] a tex]t

如您所见,正则表达式必须仅突出显示具有父大括号的大括号。不得选择没有父大括号的大括号。

例如 [is] 和 s[o]me 没有父大括号,因此不得突出显示它们。但是 [d[um]my], [se[le]ct i[nn]er b]race 有父大括号,因此括号必须选择其中的文本。

我尝试了以下 PCRE 正则表达式:

\[[^\[]+?]

https://regex101.com/r/xR0wM3/12

但它也突出显示了没有外括号的括号。这是唯一需要解决的问题,所有其他文本突出显示都工作正常。在提供的示例中,必须进行更改,以便不能选择没有父大括号的大括号。即,在示例中 [is] 正在选择超出要求范围的内容。如果这个问题解决了,那么我的要求就完成了。

最佳答案

请记住

There will be only one parent brace i.e only one nested level.

您可以在PHP中使用以下正则表达式:

(?:\[|(?!^)\G).*?(\[[^\[\]]*\])

参见demo

(?:\[|(?!^)\G)部分将确保我们只匹配 [...]位于另一对 [...] 内.

没有捕获组并使用 \K 的更优化变体(省略了比赛的整个初始部分):

(?:\[|(?!^)\G)[^\[\]]*\K\[[^\[\]]*\]

参见demo 2

JavaScript 方法包括 2 个步骤:

  • 我们使用 var re = /[^\[]+(\[(?:[^\[\]]|\[[^\[\]]*\])*\])/g; 提取带有父括号的子字符串。
  • 然后,我们提取所有内部 [...]这些 block 中带有 rx = /\[[^\[\]]+\](?=(?:[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]))/g; 的子字符串.

var re = /[^\[]+(\[(?:[^\[\]]|\[[^\[\]]*\])*\])/g; 
var str = 'This [is] some [d[um]my] text. How to [se[le]ct i[nn]er b]race wi[th[out s]ele[ct]ing th]e outer b[race [in] a tex]t';
var m;

while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {
re.lastIndex++;
}
rx = /\[[^\[\]]+\](?=(?:[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]))/g;
var n;
while ((n = rx.exec(m[1])) !== null) {
if (n.index === rx.lastIndex) {
rx.lastIndex++;
}
document.getElementById("r").innerHTML += n[0]+"<br/>";
}
}
<div id="r"/>

关于第二个正则表达式的几句话:(?=(?:[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]))前瞻是确保存在除 [ 以外的字符和] ( [^\[\]]* ),或 [...]子字符串 ( \[[^\[\]]*\] ),然后是结束 ]应该遵循。可以写成(?=(?:[^\[\]]|\[[^\[\]]*\])*\]) ,但我使用的未包装版本效率更高(虽然看起来很不整洁。这是 JS,抱歉。)

关于javascript - 仅当有外支撑时才选择内支撑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32047508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com