我遇到以下正则表达式的问题:
acoustic
上面,我希望arr [2](即捕获组2)是“文件”,与最后一个匹配 应用贪婪后第一行中的4个字符。*,由于/中的回溯 模式,然后通过$。锚定到行尾。
实际上,arr []为空,这意味着模式甚至不匹配。
我可以稍微改变一下,这样就完全符合我的意图:
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]);
我的问题并非如此,如何从s的第一行末尾获取“文件”。 相反,我试图理解为什么第一个正则表达式失败而第二个正则表达式失败 成功。为什么$与示例1中的\ r \ n换行符不匹配?是不是 它存在的唯一目的是什么?还有其他我想念的东西吗?
另外,考虑与sed中使用的相同的第一个正则表达式(with 使用-r)启用扩展正则表达式模式:
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
此处,捕获组2捕获“文件”而没有其他内容。 “hello”出现在输出中,但内部不存在 捕获组,由输出中字符串“.OUTSIDE.OF.CAPTURE.GROUP”的位置证明。 所以正则表达式根据我在sed中的理解工作,但不使用内置的Javascript regexp引擎。
如果我用\ n替换输入字符串中的\ r \ n,则上述所有三个示例的行为都是相同的,因此就我所知,这应该不相关。
答案 0 :(得分:5)
您需要启用正则表达式多行模式以匹配行尾字符
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$", "m");