在Javascript中,通过成对的分隔符、多次出现和排除来分割字符串



我希望通过查找{}成对分隔符来拆分Javascript中的字符串。

这些可能在同一字符串中多次出现,并且当先行词出现或它们分布在新行n时会被跳过。

整个字符串本身来自txt文件,需要单独处理这些值。

Grab this {value1}, and also this other {value2}.n
Do not grab this {value3}, and leave behind {value4 andn
value5} too.

这里要使用的regexp对我来说似乎非常复杂,我真的很感激你的帮助!这是我第一次尝试解决这个问题:https://regex101.com/r/zjtKFp/1

[^\]{([^}n]+)}

您的尝试正朝着正确的方向发展。你不应该担心匹配的额外角色,因为你可以处理不包括该角色的捕获组。

然而,您的正则表达式中仍然存在一些缺点:

  • 如果左大括号是输入的第一个字符,那么它将不匹配
  • 如果在左大括号之前有两个反斜杠(或扩展为偶数(,则大括号也将不匹配,而实际上应该匹配:反斜杠不会转义大括号,而是由其前面的反斜杠转义
  • 如果存在与n不同的换行符(如r(,则不会拒绝该换行符。您可以使用点(.(与换行符不匹配的事实(除非覆盖默认行为(
  • 如果结束大括号用反斜杠转义,则可能不应将其解释为匹配的结束。。。因此,这里需要一个类似于大括号的算法

您可以使用以下正则表达式改进这些点:

(?:[^\]|^)(?:\\)*{(.*?(?=.)[^\](?:\\)*)}

以下是JavaScript中的一个实现,演示了使用捕获组可以去掉额外的字符:

let s = String.raw`{here}, grab this {value1}, and also this other {value2}.
Do not grab this {value3}, and leave behind {value4 and
value5} too, and likewise {value6\}.`;
let matches = Array.from(
s.matchAll(/(?:[^\]|^)(?:\\)*{(.*?(?=.)[^\](?:\\)*)}/g), 
([_, grp]) => grp
);
console.log(matches);

注意:通常你会在正则表达式中转义大括号,因为它们有作为量词的含义,就像在a{1,3}中一样,但由于它们在这个正则表达式中没有这样使用,所以它不需要转义它们。

最新更新