1

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需求。

谢谢 :)

4

1 回答 1

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 重新设计以捕获将用于替换的男性和女性标记。
  • r 使用生成器构造的数组。
  • 在循环中,仅使用$1$2 $1$3, 意思{root}{male marker} {root}{female marker}

分叉的 JSFiddle

于 2018-01-28T09:28:38.100 回答