Javascript 正则表达式中的$未针对行尾进行加工

Javascript 正则表达式中的$未针对行尾进行加工,javascript,regex,sed,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]); 如上所述,我希望arr[2](即捕获组2)是“文件”,与上一个匹配 应用贪婪。*后,第一行中有4个字符,由于 模式,然后通过$将其锚定到行的末尾 事实上,arr[]为null,这意味着模式

我对以下正则表达式有问题:

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]);
如上所述,我希望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
我的问题不是如何从s中第一行末尾抓取多少“文件”。 相反,我试图理解为什么第一个regexp失败,第二个regexp失败 成功。为什么在示例1中,$与\r\n换行符不匹配?不是吗 这是它存在的唯一目的吗?我还缺什么吗

也可以考虑与SED中使用的第一个正则表达式相同的表达式 使用-r启用扩展正则表达式模式):

$echo-e”http://www.google.com/dir/file\r\nhello“| sed-r-e的#http://([^/]+)./([^/\r\n]+)$#\2.OUTSIDE.OF.CAPTURE.GROUP#”
file.OUTSIDE.OF.CAPTURE.GROUP
你好
在这里,捕获组2捕获“文件”而不是其他内容。“hello”出现在输出中,但不存在于内部 捕获组,由字符串“.OUTSIDE.of.capture.group”在输出中的位置证明。 因此,正则表达式根据我在sed中的理解工作,但不使用内置的Javascript regexp引擎


如果将输入字符串中的\r\n替换为just\n,则上述三个示例的行为都是相同的,因此据我所知,这不应该相关。

您需要启用regex多行模式以匹配行尾字符

var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$", "m");


你忘了逃出
/
看看这里:乔治:恐怕不是这样。正如您在链接中所看到的,它为第二个捕获组捕获了“file\r\nhello”,而我只是尝试捕获“file”。/据我所知,在RegExp(“…”)中使用时不应被视为分隔符,在sed脚本中也不应被视为分隔符,其中#是分隔符。不过还是谢谢你。
var re = new RegExp("http://([^/]+).*/([^/\r\n]+)$", "m");