JavaScript RegExp除动态系列之外的所有字符

时间:2017-05-31 21:29:13

标签: javascript regex

所以,我正在开发一个开源项目,以扩展我对JavaScript的了解,并创建了一个动态处理字符串的实用程序,并用其他字符串替换特定的事件。

以下是一个例子:

  

jdhfkjhs${c1}kdfjh$%^%$S654sgdsjh${c20}SUYTDRF^%$&*#(Y

假设我选择了字符'#',RegExp将其处理为:

  

########${c1}####################${c20}###############

我面临的问题是我的RegExp /[^\$\{c\d\}]/g也匹配RegExp中的任何字符,因此_,met$$$$$1234{}cccgg.之类的字符串将作为#####$$$$$1234{}ccc###

有没有办法可以通过JavaScript捕获这样一个动态组,或者我应该找到另一种方法来实现我的目标?

对于某些上下文,可以找到项目代码here

1 个答案:

答案 0 :(得分:1)

您可以匹配该组并将其捕获以便稍后恢复,并且只匹配任何字符(如果没有预期的换行符,则为.或与[^] / [\s\S]匹配)

var rx = /(\${c\d+})|./g;
var str = 'jdhfkjhs\${c1}kdfjh\$%^%\$S654sgdsjh\${c20}SUYTDRF^%\$&*#(Y';
var result = str.replace(rx, function ($0,$1) {
  return $1 ? $1 : '#';
});
console.log(result);

<强>详情:

  • (\${c\d+}) - 第1组:文字${c子字符串,然后是1位数字和文字}
  • | - 或
  • . - 除了换行符之外的任何字符(如果您使用[^][\s\S],则为任何字符。)

在替换中,$0代表整个匹配,$1代表第一个捕获组的内容。如果设置了$1,则会将其重新插入到生成的字符串中,否则,char将替换为#