【问题标题】:Optional character in Regex lookbehind (JS)正则表达式后视(JS)中的可选字符
【发布时间】:2020-02-27 05:12:01
【问题描述】:

我正在尝试使用正则表达式来解析模板中的一些内容。有开始标签和结束标签,但我只想选择这些标签之间的内容(以便我可以String.replace)

内容如下所示:

OpenTag
  The Content I want
CloseTag

OpenTag The Content I want CloseTag

我使用的正则表达式如下所示:

/(?<=OpenTag(\n))(.*?)(?=CloseTag)/msg

我遇到的问题是,有时可能会有换行符,有时没有,但只要我通过(\n)? 在后视中将换行符设为可选,换行符就会包含在捕获组中(甚至虽然看起来它应该是背后的一部分)。

如果我取消可选换行符,那么内容中的第二个示例将无法匹配。

regex101.com 上的示例,https://regex101.com/r/teBEQ9/2

【问题讨论】:

  • JS 不支持正向回溯。
  • 这不是一个积极的向后看,因为我想匹配 OpenTag (以及可选的换行符)在匹配之前的位置吗?与匹配 not 优先 的匹配相反
  • 我认为您不需要前瞻或后视,只需以 OpenTag 开始您的正则表达式并以 CloseTag 结束并捕获它的中间部分
  • @MonkeyZeus: caniuse.com/…
  • 很高兴我能帮上忙。我使用 Firefox,但它失败了,所以我没有费心检查 Chrome,所以我们都是对的,哈哈

标签: javascript regex regex-lookarounds


【解决方案1】:

带有s 标志的点也与\n 字符匹配,因为它是可选的,所以它被捕获。使用Array.match() 并修剪结果:

const str = `OpenTag
  The Content I want
CloseTag

OpenTag The Content I want CloseTag`

const result = str.match(/(?<=OpenTag)(.*?)(?=CloseTag)/msg).map(s => s.trim())

console.log(result)

【讨论】:

  • TY 用于响应,因此在这种情况下听起来可选意味着“允许但不包含在后视中”,我希望它的意思是“如果存在则包含在后视中”。似乎没有办法编写一个相当于“捕获匹配被“foo”或“foo\n”排除的lookbehind,同时也将“\n”排除在捕获组之外。
  • 匹配是贪婪的。在某些情况下,您可以告诉他们懒惰 - 例如.*?,但在这种情况下不是。
【解决方案2】:

你可以使用类似的东西:

OpenTag\s*([^]*?)\s*CloseTag

您想要的文本将在$1

https://regex101.com/r/FRbTKb/2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2014-07-31
    相关资源
    最近更新 更多