2015-10-05 73 views
5

末我有以下正则表达式的一个问题:

var s = "http://www.google.com/dir/file\r\nhello" 
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$"); 
var arr = re.exec(s); 
alert(arr[2]); 

上面,我期待的常用3 [2](即捕获第2组)为“文件”,在应用贪婪。*后,在第一行中匹配最后一个 4个字符,由于/在 模式中进行回溯,然后在行尾锚定$。

事实上,arr []为null,这意味着模式甚至不匹配。

我可以稍微改变这种所以它正是我打算:

var s = "http://www.google.com/dir/file\r\nhello" 
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)[\r\n]*"); 
var arr = re.exec(s); 
alert(arr[2]); // "file", as expected 

我的问题不在于有多少如何从s中的第一行的最后抢“文件”。 相反,我试图理解为什么第一个正则表达式失败,第二个成功。为什么$不匹配例1中的\ r \ n换行符?它的存在的唯一目的不是 吗?还有什么我失踪?

另外,还要考虑同第一正则表达式作为在sed使用(与-r启用 扩展正则表达式模式):

$ echo -e "http://www.google.com/dir/file\r\nhello" |sed -r -e 's#http://([^/]+).*/([^/\r\n]+)$#\2.OUTSIDE.OF.CAPTURE.GROUP#' 
<<OUTPUT>> 
file.OUTSIDE.OF.CAPTURE.GROUP 
hello 

这里,捕获组2个捕获“文件”,并没有别的。输出中出现“hello”,但在捕获组内不存在 ,这由输出中字符串“.OUTSIDE.OF.CAPTURE.GROUP”的位置证明。 所以正则表达式根据我在sed中的理解工作,但不使用内置的Javascript 正则表达式引擎。

如果我只用\ n替换输入字符串中的\ r \ n,上述所有三个示例的行为都是相同的,所以根据我所知,这应该不会相关。

+0

你忘了逃跑的'/'看到它在这里:https://开头regex101 .com/r/cV1nJ0/1 –

+1

Jorge:恐怕不是这样。正如你在链接中看到的那样,捕获第二个捕获组的“file \ r \ nhello”,而我试图捕获“文件”。 /在使用RegExp(“...”)时,不应将其视为分隔符,也不能在sed脚本中使用#作为分隔符。不过谢谢。 – jrsanderson

回答