gpt4 book ai didi

Javascript - 替换字符串中的单词,除非该单词包含在引号中

转载 作者:行者123 更新时间:2023-12-05 02:25:55 26 4
gpt4 key购买 nike

我正在编写一些解析某些 SQL 表达式的代码,但遇到了一个我自己无法解决的问题。我想替换 SQL 语句中的某个词,但如果该词包含在用单引号或双引号括起来的短语中,则我不想替换。我的用例是 SQL 表达式解析,但我认为这更像是一个通用的字符串替换。

举个例子考虑表达式:从表格中选择 {foo},其中 {foo} = "This is {foo} today"or {foo} = 'this is {foo} tomorrrow' or {foo} = "it's all '{foo}' to me !”

假设我想将 {foo} 替换为字符串 bar,输出将是:从表格中选择 bar,其中 bar = "This is {foo} today"or bar = 'this is {foo} tomorrow' or bar = "it's all '{foo}' to me!"

正如我们所见,所有用引号(​​单引号或双引号)括起来的 {foo} 表达式都没有被替换。

我们可以假设引号将被关闭,即不会有杂散的引号 float (where {foo} = 'un'even" 不是我们需要考虑的用例.)

嵌套引号内的文本不应被替换(无论您怎么看,文本都包含在引号内:))该示例在 or {foo} = "it's all '{foo }' to me!" 部分(以及包含三个单引号只是为了好玩)

我对此做了很多研究,用 Javascript(或任何其他语言无疑)做这件事似乎很棘手。这似乎很适合正则表达式,但任何 javascript 解决方案正则表达式都会有所帮助。我在 Stack Overflow 中最接近的解决方案是 Don't replace regex if it is enclosed by a character但这还不够接近以提供帮助

最佳答案

对于使用 JavaScript 的示例字符串,您可以使用单一模式和回调捕获组来检查。

(['"]).*?\1|({foo})

模式匹配:

  • (['"]) 第 1 组,捕获 "'
  • .*? 匹配任意字符,尽可能少
  • \1 匹配组 1 中捕获的相同字符
  • | 或者
  • ({foo}) 在组 2 中捕获 {foo}

Regex demo

在组 2 的回调检查中。如果存在,则返回它,否则返回整个匹配项。

const regex = /(['"]).*?\1|({foo})/g;
const str = `select {foo} from Table where {foo} = "This is {foo} today" or {foo} = 'this is {foo} tomorrrow' or {foo} = "it's all '{foo}' to me!"`;
const result = str.replace(regex, (m, _, g2) => g2 ? "bar" : m);
console.log(result);

关于Javascript - 替换字符串中的单词,除非该单词包含在引号中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74189654/

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