在Javascript中,在多次出现时,通过成对分隔符拆分字符串,并进行排除

在Javascript中,在多次出现时,通过成对分隔符拆分字符串,并进行排除,javascript,regex,Javascript,Regex,我希望通过查找{}成对分隔符来拆分Javascript中的字符串 这些可能在同一字符串中多次出现,并且在出现先行项\或它们跨新行时被跳过\n 整个字符串本身来自一个txt文件,需要单独处理这些值 Grab this {value1}, and also this other {value2}.\n Do not grab this \{value3}, and leave behind {value4 and\n value5} too. 这里使用的regexp对我来说似乎非常复杂,我非常感谢

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

这些可能在同一字符串中多次出现,并且在出现先行项
\
或它们跨新行时被跳过
\n

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

Grab this {value1}, and also this other {value2}.\n
Do not grab this \{value3}, and leave behind {value4 and\n
value5} too.
这里使用的regexp对我来说似乎非常复杂,我非常感谢您的帮助!这是我第一次尝试解决这个问题:


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

您的尝试方向正确。您不应该担心匹配的额外角色,因为您可以只处理不包含该角色的捕获组

但是,您的产品仍有一些缺点:

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

下面是一个JavaScript实现,演示了使用捕获组可以消除额外字符:

让s=String.raw`{here},抓取这个{value1},还有这个{value2}。
不要抓住这个\{value3},留下{value4和
value5},同样{value6\\\};
让matches=Array.from(
s、 匹配所有(/(?:[^\\]\^)(?:\\\\\\)*{(.*(?=)[^\\](?:\\\\\\)*)}/g),
([[uu,grp])=>grp
);

console.log(匹配项)你到底想做什么?你想替换它们吗?为什么不使用字符串文字?@epascarello问得好,我只是改进了我的,让它更清晰一点。我希望替换和处理这些值,但字符串本身存在于外部txt文件中!展示你的尝试通常是值得赞赏的。@MonkeyZeus这是我的尝试!我无法去除括号前的空白。所以你现在的问题归结为如何避免捕捉到开头括号前的角色?非常感谢你也预见到了我将面临的所有其他问题!这可能与正在发生的另一个问题有关,但我正在使用
fs.readFile('./file.txt',utf8')
读取该文件。在这种情况下,rexeg似乎没有排除“\”。我怎么能抓住它?你怎么拿到绳子都没关系。在应用正则表达式之前,只需检查字符串的外观。确保在应用正则表达式时反斜杠“情况”是什么。如果您对特定字符串有问题,请告诉我它是哪个字符串。我遇到的问题是/{value3}。如果我像您的示例那样将整个文本写在
js
文件中,regexp工作正常!但是,如果我尝试从一个外部文件中加载并处理它,并使用
fs.readFile
,/{value3}并没有被排除在外。这只是证明字符串不是您所认为的那样。字符串的历史记录(无论是从文件读取还是从控制台输入,或是其他什么)都与此无关。相关的是应用正则表达式时字符串的内容。它可能有助于打印字符串的长度。如果您误解了调试结果,则很容易被字符串中反斜杠的数量所欺骗。打印长度和计数字符有助于查明误解。请注意,在您之前的评论中,您有一个正斜杠。如果您可以对您的字符串执行
console.log(JSON.stringify(str))
(从文件中读取该字符串后的情况),并按照您在console中从该语句中获得的信息准确地告诉我,我可以尝试帮助您找到问题所在。请注意,由于JSON格式,此输出将使反斜杠加倍。