递归中的变量.replace with regexp
Variables in recursive .replace with regexp
对于语法纠正程序,我不得不使用 28 个不同的 RegExp
。
所以我做了一个简单的for
函数来一起处理所有更正。
var z = $(textarea).val();
for (const q of r){
z = z.replace(q.x, q.y);
}
$(textarea).val(z)
但是在这些 RegExp 中,我有 2 个冗余模式我想用作变量。
无效示例:
const d = new RegExp(/([^ ]+)/),
s = new RegExp(/[·\-\.•]/),
$e = d.source,
$t = s.source,
r = [
{"x":/($e)ain$tine/gi, "y":'ain ine'},
{"x":/($e)oux$tsse/gi, "y":'oux sse'},
{"x":/($e)gnon$tagne/gi, "y":'gnon gne'},
]
我怎样才能正确地做到这一点?
我找到了一些解决方案,但更适用于一个 RegExp
需求。
谢谢:)
更多地与 javascript 字符串插值相关。它只会出现在模板字符串中,即用反引号括起来的字符串。
然后您可以将非工作样本转换为:
const d = '[^ ]+', // No need to include parens twice, skipped here cause imho looks more clear to include it where it is used (below in array definition aside replacement pattern then)
s = '[-·.•]', // Note here, reordering for '-', and skipping unneaded '\' before '.' in character class
r = [
{"x":new RegExp(`(${d})ain${s}ine`,'gi'), "y":'ain ine'},
{"x":new RegExp(`(${d})oux${s}sse`,'gi'), "y":'oux sse'},
{"x":new RegExp(`(${d})gnon${s}agne`,'gi'), "y":'gnon gne'},
]
更进一步,我认为我们可以使用以下内容进行更多概括:
function g(male, female) {
return new RegExp(`([^ ]+)(${male})[-·.•](${female})`, 'gi');
}
const r = [
g('ain', 'ine'),
g('oux', 'ouse'),
g('gnon', 'gne')
]
$("button").on("click",function(){
var z = $('#zone').val();
for (const q of r){
z = z.replace(q, ' ')
}
$('#zone').val(z)
});
- g 函数是我们的正则表达式生成器。 RegExp 重新设计以捕获将用于替换的男性和女性标记。
- r 使用生成器构造的数组。
- 在循环中,只使用
,意思是{root}{male marker} {root}{female marker}
。
对于语法纠正程序,我不得不使用 28 个不同的 RegExp
。
所以我做了一个简单的for
函数来一起处理所有更正。
var z = $(textarea).val();
for (const q of r){
z = z.replace(q.x, q.y);
}
$(textarea).val(z)
但是在这些 RegExp 中,我有 2 个冗余模式我想用作变量。
无效示例:
const d = new RegExp(/([^ ]+)/),
s = new RegExp(/[·\-\.•]/),
$e = d.source,
$t = s.source,
r = [
{"x":/($e)ain$tine/gi, "y":'ain ine'},
{"x":/($e)oux$tsse/gi, "y":'oux sse'},
{"x":/($e)gnon$tagne/gi, "y":'gnon gne'},
]
我怎样才能正确地做到这一点?
我找到了一些解决方案,但更适用于一个 RegExp
需求。
谢谢:)
更多地与 javascript 字符串插值相关。它只会出现在模板字符串中,即用反引号括起来的字符串。
然后您可以将非工作样本转换为:
const d = '[^ ]+', // No need to include parens twice, skipped here cause imho looks more clear to include it where it is used (below in array definition aside replacement pattern then)
s = '[-·.•]', // Note here, reordering for '-', and skipping unneaded '\' before '.' in character class
r = [
{"x":new RegExp(`(${d})ain${s}ine`,'gi'), "y":'ain ine'},
{"x":new RegExp(`(${d})oux${s}sse`,'gi'), "y":'oux sse'},
{"x":new RegExp(`(${d})gnon${s}agne`,'gi'), "y":'gnon gne'},
]
更进一步,我认为我们可以使用以下内容进行更多概括:
function g(male, female) {
return new RegExp(`([^ ]+)(${male})[-·.•](${female})`, 'gi');
}
const r = [
g('ain', 'ine'),
g('oux', 'ouse'),
g('gnon', 'gne')
]
$("button").on("click",function(){
var z = $('#zone').val();
for (const q of r){
z = z.replace(q, ' ')
}
$('#zone').val(z)
});
- g 函数是我们的正则表达式生成器。 RegExp 重新设计以捕获将用于替换的男性和女性标记。
- r 使用生成器构造的数组。
- 在循环中,只使用
{root}{male marker} {root}{female marker}
。