在处理javascript正则表达式时,我并没有在capturing parentheses上得到这个概念。我不明白为什么我们需要括号用于以下示例
var x = "{xxx} blah blah blah {yyy} and {111}";
x.replace( /{([^{}]*)}/g ,
function(match,content) {
console.log(match,content);
return "whatever";
});
//it will print
{xxx} xxx
{yyy} yyy
{111} 111
所以当我从模式x
中删除括号时,结果会给出不同的值
x.replace( /{[^{}]*}/g ,
function(match,content) {
console.log(match,content);
return "whatever";
});
//it will print
{xxx} 0
{yyy} 37
{111} 49
所以内容值现在变成数值,我不明白为什么。有人可以解释幕后发生的事情吗?
答案 0 :(得分:4)
根据MDN documentation,函数的参数将依次为:
因此,在第一个示例中,content
将是在组1中捕获的字符串。但是当您在第二个示例中删除该组时,content
实际上是找到匹配项的索引
答案 1 :(得分:1)
这对替换文本很有用。
例如,我有这个字符串“一二三四”,我想要反转像“四个三二一”。为此,我将使用以下代码:
var reversed = "one two three four".replace(/(one) (two) (three) (four)/, "$4 $3 $2 $1");
请注意$ n代表字符串中的每个单词。
另一个例子:我有相同的字符串“一二三四”,我想打印两个字:
var eachWordTwice = "one two three four".replace(/(one) (two) (three) (four)/, "$1 $1 $2 $2 $3 $3 $4 $4");
答案 2 :(得分:0)
数字:
匹配的子字符串在总字符串中的偏移量 检查。 (例如,如果总字符串是“abcd”,那么 匹配的子串是“bc”,那么这个参数将是1。)
来源:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
“将函数指定为参数”部分
答案 3 :(得分:0)
括号用于捕获/替换匹配的一部分。例如,当我使用它来匹配可能有或没有扩展名的电话号码时。此函数匹配整个字符串(如果if
正确),因此整个字符串被替换,但我只使用特定顺序的特定类型的字符,具有空格或其他(“() - x “)输入中允许的字符。
如果给出6512589631x1234或1 651 258 9631 1234,它将始终输出格式为(651)258-9631 x1234的字符串。它也不允许(或在本例中为格式化)免费电话号码,因为它们不是允许在我的领域。
function phoneNumber(v) {
// take in a string, return a formatted string (651) 651-6511 x1234
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi) !== -1) {return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi,"($1) $2-$3 x$4"); }
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi) !== -1) { return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi,"($1) $2-$3"); }
return v;
}
这允许我做的是收集区号,前缀,行号和可选扩展名,并按照我需要的方式对其进行格式化(例如,对于不能按照指示操作的用户)。
因此,您输入6516516511x1234或“(651)651-6511 x1234”,它将匹配此示例中的一个正则表达式或另一个正则表达式。
现在代码中发生的事情是@amine-hajyoussef所说的 - 正在返回每个匹配开始的索引。 match
可以更好地使用该代码,例如一个(文本返回)或索引的search
,如示例二所示。 p.s.w.g's答案扩大了。