2014-09-03 44 views
2

我得到的结果是:的Javascript:奇怪的正则表达式的行为

_a_b_|_c_d_ 
使用下面的代码/正则表达式时

var separator = "|"; 
var ex = new RegExp(separator,"g"); 
var result = "ab|cd".replace(ex, "_"); 

console.log(result); 

为什么会那样做的?

我期望(和希望)只能更换所有管道中的字符串:

ab_cd 

回答

3

你应该逃避你的正则表达式的|象征,因此,它将匹配一个|符号。在正则表达式|称为逻辑OR运算符,通常用于合并或OR两个正则表达式。

获得_a_b_|_c_d_作为输出的原因是什么?

我已经说过|被称为逻辑OR运算符。它的语法就像regex1|regex2|regex3|regex4.......等等。但在你的案例|中,在OR(|)操作符之前和之后没有模式。所以它会在每个角色前后都进行零宽度匹配。用_代替零宽度匹配会给你_a_b_|_c_d_

> var separator = "\\|"; 
undefined 
> var ex = new RegExp(separator,"g"); 
undefined 
> var result = "ab|cd".replace(ex, "_"); 
undefined 
> console.log(result); 
ab_cd 

OR

> var separator = /\|/g; 
undefined 
> var ex = new RegExp(separator); 
undefined 
> var result = "ab|cd".replace(ex, "_") 
undefined 
> console.log(result); 
ab_cd 
+0

这似乎是重点,但“var separator =”\ |“;”不起作用。 – Thariama 2014-09-03 11:12:21

+0

+1就是这样 - 我只是想知道为什么我必须使用两个反斜杠 – Thariama 2014-09-03 11:13:14

+1

因为模式被包含在''“''中。如果在'/'符号中给出,则不需要再次反转反斜杠。 – 2014-09-03 11:14:08

1

试试这个:

var separator = "\\|"; 
var ex = new RegExp(separator,"g"); 
var result = "ab|cd".replace(ex, "_"); 

console.log(result); 
alert(result); 

因为在正则表达式还有一个特殊的意义| [要么]。

请参阅本link理解为正则表达式中的每个特殊字符,这需要逃脱\

希望这有助于意义。