【发布时间】:2015-10-06 06:53:49
【问题描述】:
我对以下正则表达式有疑问:
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 的第一行末尾抓取“文件”。 相反,我试图理解为什么第一个正则表达式失败而第二个 成功。为什么 $ 与示例 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,则上述所有三个示例的行为都是相同的,因此据我所知,这应该不相关。
【问题讨论】:
-
你忘记转义
/在这里看到它:regex101.com/r/cV1nJ0/1 -
豪尔赫:恐怕不是这样。正如您在链接中看到的那样,它为第二个捕获组捕获了“file\r\nhello”,而我试图只捕获“file”。据我所知, / 在 RegExp("...") 中使用时不应被视为分隔符,在 # 是分隔符的 sed 脚本中也不应被视为分隔符。不过还是谢谢。
标签: javascript regex sed