jrs*_*son 5 javascript regex sed
我有以下正则表达式的问题:
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]);
Run Code Online (Sandbox Code Playgroud)
在上面,我希望arr [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
Run Code Online (Sandbox Code Playgroud)
我的问题不是那么从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
Run Code Online (Sandbox Code Playgroud)
在这里,捕获组2捕获"文件"而没有别的."hello"出现在输出中,但在捕获组中不存在,这由输出中字符串".OUTSIDE.OF.CAPTURE.GROUP"的位置证明.因此正则表达式根据我在sed中的理解工作,但不使用内置的Javascript regexp引擎.
如果我用\n替换输入字符串中的\ r \n,则上述所有三个示例的行为都是相同的,因此就我所知,这应该不相关.
您需要启用正则表达式多行模式以匹配行尾字符
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$", "m");
Run Code Online (Sandbox Code Playgroud)
http://javascript.info/tutorial/ahchors-and-multiline-mode