【发布时间】:2022-01-23 23:58:06
【问题描述】:
我有以下 javascript-excerpt-as-text:
for (let orange of oranges) {
for (let apple of apples) {
for (let banana of bananas) {
obfuscatedArray[i] = obfuscatedArray[i].split('').reverse().join('');
obfuscatedArray[i] = window.atob(obfuscatedArray[i]);
}
}
}
我想从中删除底部多余的换行符:
for (let orange of oranges) {
for (let apple of apples) {
for (let banana of bananas) {
obfuscatedArray[i] = obfuscatedArray[i].split('').reverse().join('');
obfuscatedArray[i] = window.atob(obfuscatedArray[i]);
}
}
}
我已经写了这个正则表达式:
/(;|})(\n(\h*))+}/
在以下 PHP 中:
$myString = preg_replace('/(;|})(\n(\h*))+}/', "\$1\n\$3}", $myString);
但是,由于我无法确定的原因,第一个右大括号和第二个大括号之间的换行符没有被删除。
我已经在 Regex101 中测试了正则表达式(即在 PHP 的 preg_replace() 函数之外),它仍然只找到两个匹配项而不是三个。
我真的不明白我的正则表达式哪里出错了?
【问题讨论】:
-
您的模式匹配新行之前和新行之后的大括号,您不能匹配两次相同的字符。 (第二个大括号)。
-
@CasimiretHippolyte - 啊哈。谢谢你。我害怕它可能是那样的。你知道当一个匹配中包含的角色也需要包含在以后的匹配中时,通常的方法是什么?我需要在
while循环中运行preg_replace吗?或者是否有计算强度较低的替代方案? -
不,您不需要 while 循环,将最后一个
}放入不消耗字符的前瞻断言(?=})(后跟 }) ,这只是一个测试。 -
你甚至可以在不使用捕获组的情况下做到这一点:regex101.com/r/Z7vovK/1
-
@CasimiretHippolyte - 啊,太棒了!谢谢你。正面和负面的 lookaheads 和 lookbehinds - 我几乎没有使用它们。如果您想将上面的评论复制粘贴到下面的答案中,我会接受。
标签: php regex preg-replace