Javascript正则表达式替换word,但不在花括号内
我有一些内容,例如: 如果您有问题,请向StackOverflow寻求帮助 我有一个同义词列表:Javascript正则表达式替换word,但不在花括号内,javascript,regex,Javascript,Regex,我有一些内容,例如: 如果您有问题,请向StackOverflow寻求帮助 我有一个同义词列表: a={one typical|only one|one single|one sole|merely one|just one|one unitary|one small|this solitary|this slight} ask={question|inquire of|seek information from|put a question to|demand|request|expect|i
a={one typical|only one|one single|one sole|merely one|just one|one unitary|one small|this solitary|this slight}
ask={question|inquire of|seek information from|put a question to|demand|request|expect|inquire|query|interrogate}
我正在使用JavaScript来:
=
{…|…}
它不是替换整个单词,而是替换找到的每个字符。我的代码:
for(syn in allSyn) {
var rtnSyn = allSyn[syn].split("=");
var word = rtnSyn[0];
var synonym = (rtnSyn[1]).trim();
if(word && synonym){
var match = new RegExp(word, "ig");
postProcessContent = preProcessContent.replace(match, synonym);
preProcessContent = postProcessContent;
}
}
它应该用同义词替换内容词,同义词不应该出现在
{…|…}
正则表达式包括一个称为“单词边界”的东西,由\b
表示。这是一个零宽度断言(它只是检查一些东西,而不是“吃”输入),它说为了匹配,必须应用某些单词边界条件。一个例子是后跟字母的空格;给定字符串'X'
,此正则表达式将与之匹配:/\bX/
。因此,要使代码正常工作,只需在单词regex的开头和结尾添加单词边界,如下所示:
for(syn in allSyn) {
var rtnSyn = allSyn[syn].split("=");
var word = rtnSyn[0];
var synonym = (rtnSyn[1]).trim();
if(word && synonym){
var match = new RegExp("\\b"+word+"\\b", "ig");
postProcessContent = preProcessContent.replace(match, synonym);
preProcessContent = postProcessContent;
}
}
[请注意,每个单词边界匹配器中都有两个反斜杠,因为在javascript字符串中,反斜杠用于转义字符——两个反斜杠会变成一个文字反斜杠。]正则表达式包括一个称为“单词边界”的东西,由
\b
表示。这是一个零宽度断言(它只是检查一些东西,而不是“吃”输入),它说为了匹配,必须应用某些单词边界条件。一个例子是后跟字母的空格;给定字符串'X'
,此正则表达式将与之匹配:/\bX/
。因此,要使代码正常工作,只需在单词regex的开头和结尾添加单词边界,如下所示:
for(syn in allSyn) {
var rtnSyn = allSyn[syn].split("=");
var word = rtnSyn[0];
var synonym = (rtnSyn[1]).trim();
if(word && synonym){
var match = new RegExp("\\b"+word+"\\b", "ig");
postProcessContent = preProcessContent.replace(match, synonym);
preProcessContent = postProcessContent;
}
}
[请注意,每个单词边界匹配器中都有两个反斜杠,因为在javascript字符串中,反斜杠用于转义字符——两个反斜杠会变成文字反斜杠。]构建regexp时,需要在开头和结尾都包含反斜杠,以匹配整个单词(仅以
[a-zA-Z0-9.
中的字符开头和结尾):
根据您正在进行的特定替换,您可能希望将您的方法应用于使用诸如/\w+/g
之类的regexp匹配的单个单词(而不是一次应用于整个文本),以避免替换本身就是其他单词的单词。例如:
content = content.replace(/\w+/g, function(word) {
for(var i = 0, L = allSyn.length; i < L; ++i) {
var rtnSyn = allSyn[syn].split("=");
var synonym = (rtnSyn[1]).trim();
if(synonym && rtnSyn[0].toLowerCase() == word.toLowerCase()) return synonym;
}
});
content=content.replace(/\w+/g,函数(word){
对于(变量i=0,L=allSyn.length;i
当您构建regexp时,您需要在开头和结尾都包含以匹配整个单词(以[a-zA-Z0-9]中的字符开头和结尾)
:
根据您正在进行的特定替换,您可能希望将您的方法应用于使用诸如/\w+/g
之类的regexp匹配的单个单词(而不是一次应用于整个文本),以避免替换本身就是其他单词的单词。例如:
content = content.replace(/\w+/g, function(word) {
for(var i = 0, L = allSyn.length; i < L; ++i) {
var rtnSyn = allSyn[syn].split("=");
var synonym = (rtnSyn[1]).trim();
if(synonym && rtnSyn[0].toLowerCase() == word.toLowerCase()) return synonym;
}
});
content=content.replace(/\w+/g,函数(word){
对于(变量i=0,L=allSyn.length;i
为了优化,不要在每次迭代中创建一个新的RegExp。相反,构建一个大的regex,比如[^{a-Za-z](a | ask |…)[^}a-Za-z]
和一个散列,每个键都有一个值,指定替换它的内容。我对JavaScript不够熟悉,无法动态创建代码
注意分隔符regex,它表示匹配不能以
{
开头或以}
结尾。这不是非常精确,但希望在实践中可以接受。如果您确实需要替换{
或}旁边的单词
那么这当然可以改进,但我希望我们不必这样做。为了优化,不要在每次迭代中创建一个新的正则表达式。相反,构建一个大的正则表达式,如[^{a-Za-z](a | ask |…)[^}a-Za-z]
和一个散列,每个键都有一个值,指定替换它的内容。我对JavaScript不够熟悉,无法动态创建代码
注意分隔符regex,它表示匹配不能以
{
开头或以}
结尾。这不是非常精确,但希望在实践中可以接受。如果您确实需要替换{
或}旁边的单词
那么这当然可以改进,但我希望我们不必这样做。我不想替换已经同义化但不在{…|…}中的项目。我不想替换已经同义化但不在{…|…}中的项目。我不想替换已经同义化但不在{…|…}中的项目。我不想替换已经同义化但不在{…|…}中的项目你收到了两个答案,你对这两个答案都给出了相同的否定回答。你不认为这可能意味着你需要重新表述你的问题吗?请澄清你想要完成什么。特别是,你如何定义allSyn
?嗨,我不是有意给出否定回答。我只是这个论坛的新手。她的我正在做的事情1:阅读我们的文件ing ajax.word={synonym | synonym}2:var allSyn=(http.responseText.replace(/\s+$/g,“)).split(“\n”);3:从div 4获取预处理内容:在allSyn中循环,在预处理内容中找到该词并替换相同的词(