【问题标题】:$ in regular expression not maching against end of line正则表达式中的 $ 与行尾不匹配
【发布时间】: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


【解决方案1】:

您需要启用正则表达式多行模式以匹配行尾字符

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

http://javascript.info/tutorial/ahchors-and-multiline-mode

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多