javascript lookback正则表达式

时间:2014-12-28 15:47:50

标签: javascript regex

我想用数字_替换字符串中没有1前面的所有字母。

所以

jj*_sin(jj)+_cos(hh)

应该是

1*_sin(1)+_cos(1)

如何使用正则表达式回溯或任何其他方法来实现它。

3 个答案:

答案 0 :(得分:4)

使用如下所示的否定先行断言。

(?!_)\b[a-z]+

然后用1

替换匹配的字符

DEMO

> "jj*_sin(jj)+_cos(hh)".replace(/(?!_)\b[a-z]+/g, "1")
'1*_sin(1)+_cos(1)'



var str = "jj*_sin(jj)+_cos(hh)";
snippet.log("Before: " + str);
str = str.replace(/(^|[^_])\b[a-z]+/g, "$11");
snippet.log("After:  " + str);

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

\b单词边界在上面的正则表达式中是一个重要的东西,它在单词字符和非单词字符之间进行匹配。 (^|[^_])捕获一行或一个不是下划线的字符的开头。 \b在这里很重要,因为没有\b,它会匹配像9foo这样的字符串。 \b确保字母表前面有非单词字符或起始锚点。 [a-z]+匹配一个或多个小写字母。因此,通过将所有匹配的字符替换为组索引1中的字符加上数字1,将为您提供所需的输出。

答案 1 :(得分:1)

可以使用String#replace和正则表达式执行此操作,但当nhahtdh指出in a comment时,它可能只会让你到目前为止。你可能最好建立一个解析器,可能使用Jison或其他几个解析器生成器。

您这样做的方法是使用捕获组和回调函数:

var str = "jj*_sin(jj)+_cos(hh)";
snippet.log("Before: " + str);
str = str.replace(/(_?)([a-zA-Z]+)/g, function(m, c0, c1) {
  return c0 === "_" ? m : c0 + "1";
});
snippet.log("After:  " + str);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 2 :(得分:0)

1 * _sin(1)+ _ COS(1)

var str = "jj*_sin(jj)+_cos(hh)";
snippet.log("Before: " + str);
str = str.replace(/(_?)([a-zA-Z]+)/g, function(m, c0, c1) {
  return c0 === "_" ? m : c0 + "1";
});
snippet.log("After:  " + str);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>