Javascript 用引号替换双引号

Javascript 用引号替换双引号,javascript,jquery,regex,Javascript,Jquery,Regex,我正在寻找一种在用户输入中用“更正的”引号替换引号的方法 想法 下面是一个简要介绍该原理的片段: 对于引号,“正确”的引号有一个开头“和一个结尾”,因此需要以良好的方式替换 $('#myInput')。打开(“键控”,函数(e){ //如果之前或之后没有空间,则以下选项不起作用。 this.value=this.value.replace(/“/g,”); this.value=this.value.replace(/“/g,”); }); 它适用于许多情况,但“单词”位于句子或行的开头或

我正在寻找一种在用户输入中用“更正的”引号替换引号的方法

想法

下面是一个简要介绍该原理的片段:
对于引号,“正确”的引号有一个开头
和一个结尾
,因此需要以良好的方式替换

$('#myInput')。打开(“键控”,函数(e){
//如果之前或之后没有空间,则以下选项不起作用。
this.value=this.value.replace(/“/g,”);
this.value=this.value.replace(/“/g,”);
});

它适用于许多情况,但“单词”位于句子或行的开头或结尾时除外

为了解决这个问题,您可以使用行的开始/结束断言和空格的交替,捕获它,并在替换中使用它:

this.value = this.value.replace(/(^| )"/g, '$1“');
this.value = this.value.replace(/"($| )/g, '”$1');
备选方案是
^ |
/
$|
。如果捕获组与断言匹配,则捕获组将为
,如果捕获组与sapce匹配,则捕获组将为

$('#myInput')。打开(“键控”,函数(e){
this.value=this.value.replace(/'/g',');
//如果之前或之后没有空间,则以下选项不起作用。
this.value=this.value.replace(/(^|)“/g,$1”);
this.value=this.value.replace(/“($)/g,“$1”);
});

因此,我将使用一个简单的循环和一个引号平衡动作,而不是遵循正则表达式替换方法。您假设出现的每个引号都将与另一个引号匹配,当它匹配时,它将被成对替换

下面是一个相同的测试实现

String.prototype.replaceAt=函数(索引,替换){
返回this.substr(0,索引)+replacement+this.substr(索引+replacement.length);
}
测验=[
//[`我很“高兴”!J'ai enfin“osé”.我是你的朋友…
//修正后应该怎么看:``我很“高兴”!我很“高兴”.你的意见是什么…
//以及修正后的情况:`],
[`tarun“lalwani`,`tarun“lalwani”`],
[`tarun lalwani`,`tarun lalwani`],
[`tarun lalwani`、`tarun lalwani`],
[`“塔伦”拉尔瓦尼`、`“塔伦”拉尔瓦尼`],
[`tarun“lalwani”`、`tarun“lalwani”`],
[`tarun lalwani`,`tarun lalwani`]
]
函数isCharacterSeparator(值){
返回/“,/.test(值)
}
用于([数据,输出]测试){
让qt=“”“
设qtL=''''''
设qtR='“'
设bal=0
让模式=/[“”]/g
让data_new=数据
while(match=pattern.exec(数据)){
如果(bal==0){
如果(match.index==0){
data_new=data_new.replaceAt(match.index,qt[bal]);
bal=1
}否则{
if(isCharacterSeparator(数据_new[match.index-1])){
data_new=data_new.replaceAt(match.index,qtL);
}否则{
data_new=data_new.replaceAt(match.index,qtR);
}
}
}否则{
if(match.index==data.length-1){
data_new=data_new.replaceAt(match.index,qtR);
}else if(isCharacterSeparator(数据_new[match.index-1])){
if(isCharacterSeparator(数据_new[match.index+1])){
//上一个是分隔符,下一个也是分隔符
//“塔伦”拉尔瓦尼
//接电话这里需要做什么?
}否则{
data_new=data_new.replaceAt(match.index,qtL);
}
}否则{
if(isCharacterSeparator(数据_new[match.index+1])){
data_new=data_new.replaceAt(match.index,qtL);
}否则{
data_new=data_new.replaceAt(match.index,qtR);
}
}
}
}
console.log(数据\u新)
如果(数据新!=输出){
log(`Failed to parse'${data}'实际='${data_new}'预期='${output}`)
} ;

}
我终于找到了一个满足我所有需求的解决方案。
我承认这比T.J.的要复杂得多,它非常适合简单的案例

请记住,我的主要问题是由于重音字符而无法使用
\b

通过使用本主题中的解决方案,我能够解决该问题:

之后,我使用了一个修改过的函数,它的灵感来自于这里的答案…

…经历了一段非常艰难的时间,与RegEx进行了大量的合作,最终找到了解决方案:

var stru_orig=`·我很“高兴”!我很高兴,我很高兴,等等,来吧,我很高兴…
·标牌上写着:“一些文字”一些文字“一些文字”和“注意这里的空格!”
⋅ "Inc”或“rect”不应替换为“tes”。
·我说:“如果它对《单身》也有效,我会更喜欢它!”
字1“字2”
字1字2“
“单词1单词2
“单词1”单词2
“单词1”单词2
“word1 word2”`;
//谢谢,这正是我需要的!
var str_norm=str_orig.normalize('NFD')。替换(/[\u0300-\u036f]/g');
//谢谢你的灵感
String.prototype.replaceQuoteAt=函数(索引,移位){
const replacers=“”””;
风险值偏移量=1*(该[指数]=“”)+2*(移位);
返回此.substr(0,索引)+替换[offset]+此.substr(索引+1);
}
//开场白:不在边界之后,不在空格之前或结尾
var re|u start=/(?!\b)[“]”(?!(\s |$)/gi;
while((match=re_start.exec(str_norm))!=null){
str_orig=str_orig.replaceQuoteAt(match.index,false);
}
//结束引号:不在空格的开头或后面,也不在边界之前

var re_end=/(?为什么不直接使用
replace(/“/g,”))
?@str,
对于引用的开头是不正确的。你能显示一些示例输入和它们的示例输出吗?这样所有的边缘情况都可以处理吗?@TarunLalwani,我添加了一些示例。小心,法语里面!@TakitIsy,当有人键入
“tarun lalwani”
时会发生什么?它也会变成
“tarun lalwani”
?W