gpt4 book ai didi

javascript - 替换引号(但不触及嵌套引号)

转载 作者:行者123 更新时间:2023-12-02 22:47:40 24 4
gpt4 key购买 nike

下一期遇到问题:我需要用 Angular 引号替换引号,但如果句子再次得到引号 - 则不应替换。

因此,为了获得公开报价,我接下来使用:

const regexStartQuote = /"(?=\S)/gm;
const replaceStartQuote = '«'

用我使用的结束语替换引用:

// const regexEndQuote = /(?<=\S)"/gm; // not supported in Mozilla
const regexEndQuote = /"(?=\s)/gm;
const replaceEndQuote = '»'

这有效。我是说:“一些文本”->“一些文本”

顺便说一句,我使用 Draftjs,并且此更改会即时应用。

我需要扩展现有的正则表达式,所以如果句子应该是这样的:

«一些文本“引号中的文本”更多»

当然,可能的变体如下:

«一些文本“引号中的文本”,更多内容»

«一些文字:“引号中的文字”,更多内容»

«一些文本:“引号中的文本”,- 更多内容»

更新

程序流程如下:键入的每个符号都会与字符串合并。我的意思是,首先当例如文本 block 为空

字符串只是``(空),

然后用户输入 'w' -> 字符串变为 w,

然后 'o' -> 字符串 wo,

那么 'w' -> 字符串是 wow,

然后 ' '(空格)-> 字符串是 wow

然后 " -> 字符串是 wow «

等等

据我了解,正则表达式应该是这样的:

`如果用户输入“并且前面没有”,但我们有“我们不应该更改”。

最佳答案

这处理发生在行边界上的带引号字符串的嵌套(带引号的字符串本身不必在 startbegin 和 end 处em> 和行尾)。这有点人为,但如果您想在外部带引号的字符串中允许多个内部带引号的字符串,那么这几乎成为必需的。这就是问题所在。考虑以下字符串:

var s = '"This is an "internal quote" within a sentence." A short sentence.\n' +
'"Another quoted sentence."\n' +
'"Yet another quoted sentence."' +
'etc.';

是什么阻止了 " A short sentence.\n""\n" ,例如,被识别为内部带引号的字符串?换句话说,无法判断引号何时表示外部引号字符串的结尾或新的内部引号字符串的开始(至少在到达整个输入的末尾之前)。

正则表达式:^([^"\n]*)"((?:[^"\n]*"[^"\n]*")*[^"\n]*)"([^*\n]*)$

  1. ^匹配行的开头。
  2. ([^"\n]*)捕获组 1:0 个或多个与 " 以外的任何内容匹配的字符或换行符。这是行中可能位于开盘报价之前的所有内容。
  3. "与开头引号匹配。现在我们将寻找带有外部引号的可选引号字符串
  4. (?:[^"\n]*"[^"\n]*")一个非捕获组,查找 0 个或多个非引号/非换行符,后跟引号,后跟 0 个或多个非引号/非换行符,后跟引号。这将是一个内部带引号的字符串。
  5. ((?:[^"\n]*"[^"\n]*"))*上述模式可以重复 0 次或多次。
  6. [^"\n]*"匹配 0 个或多个非引号/非换行符,后跟引号。这负责匹配带引号的字符串的其余部分。
  7. ([^*\n]*)匹配该行的其余部分(0 个或更多字符),其中不应包含引号。

Regular expression visualization

上面的正则表达式相当复杂,因为它检查平衡引号。如果您不想进行如此严格的检查,那么一个更简单的正则表达式将仅查找一行中的第一个和最后一个引号(并且其余代码保持不变):

/^([^"\n]*)"([^\n]*)"([^"\n])*$/gm;

var s = 'A plain line.\n' +
'This is "Some text in quotes" and some without.\n' +
'"This has "quotes within quotes" and some without."\n' +
'"This has "many" "quoted" "strings" within quotes."'
;

var regex = /^([^"\n]*)"((?:[^"\n]*"[^"\n]*")*[^"\n]*)"([^*\n]*)$/gm;
console.log(s.replace(regex, "$1«$2»$3"));

更新

要修改输入,s ,在输入时,您需要针对几个正则表达式进行测试:

  1. 如果输入匹配 /^[^"\n]*$/ (网上没有报价),则无需更换。
  2. 如果输入匹配 /^[^«\n]*«([^»\n]*»)?[^"\n]*$/ ,则无需更换。
  3. 如果输入匹配 /^([^"«\n]*)"$/ (看到的第一个报价),然后 s = s.replace('"', '«');
  4. 如果输入匹配 /^([^"«\n]*)«([^\n]*)"$/ (除了第一个引用),然后 s = s.replace('»', '"'); s = s.replace(/"$/, '»');

代码片段似乎不允许真正的一次输入一个字符,但是这个模拟了它的样子:

function test(str)
{
let s = '';
for (let i = 0; i < str.length; i++) {
key = str.charAt(i);

s += key;
if (/^[^"\n]*$/.test(s) || /^[^«\n]*«([^»\n]*»)?[^"\n]*$/.test(s))
;
else if (/^([^"«\n]*)"$/.test(s))
s = s.replace('"', '«');
else if (/^([^"«\n]*)«([^\n]*)"$/.test(s)) {
s = s.replace('»', '"');
s = s.replace(/"$/, '»');
}
console.log("\n" + s);
}

}

test('a"bc"de"fg"h"ij"');

关于javascript - 替换引号(但不触及嵌套引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58320544/

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