递归中的变量.replace with regexp

Variables in recursive .replace with regexp

JSFiddle

对于语法纠正程序,我不得不使用 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}

Forked JSFiddle