递归.replace中的变量与正则表达式

时间:2018-01-27 19:49:26

标签: javascript regex for-loop replace template-literals

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":'$1ain $1ine'},
           {"x":/($e)oux$tsse/gi,    "y":'$1oux $1sse'},
           {"x":/($e)gnon$tagne/gi,  "y":'$1gnon $1gne'},
      ]

我该如何正确地做到这一点?

我找到了一些解决方案,但更适合一个RegExp需求。

Thx:)

1 个答案:

答案 0 :(得分:1)

更多与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":'$1ain $1ine'},
        {"x":new RegExp(`(${d})oux${s}sse`,'gi'),    "y":'$1oux $1sse'},
        {"x":new RegExp(`(${d})gnon${s}agne`,'gi'),  "y":'$1gnon $1gne'},
      ]

进一步说,我认为我们可以使用以下内容进一步概括:

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, '$1$2 $1$3')
  }
  $('#zone').val(z) 
});
  • g函数是我们的RegExp生成器。 RegExp重新设计以捕获将用于替换的男性和女性标记。
  • 使用生成器构建的数组。
  • 循环播放,只需使用$1$2 $1$3,即{root}{male marker} {root}{female marker}

Forked JSFiddle