Javascript 正则表达式仅获取多行匹配

Javascript 正则表达式仅获取多行匹配,javascript,regex,Javascript,Regex,尝试使用正则表达式仅匹配多行字符串。但是下面的正则表达式同时匹配单行和多行。如何使用regex实现这一点 Regex ('|"|`)[\s\S]*?(\1) 测试字符串 "not a match" "need to match" 多行字符串是至少包含一个换行符的字符串。这样你就可以写作了 ('|"|`)[\s\S]*?\n[\s\S]*(\1) 但这将与整个示例相匹配,因为[\s\s]*也与字符串分隔符相匹配 你可能想试试 '[^

尝试使用正则表达式仅匹配多行字符串。但是下面的正则表达式同时匹配单行和多行。如何使用regex实现这一点

Regex

('|"|`)[\s\S]*?(\1)
测试字符串

"not a match"
"need
to
match"

多行字符串是至少包含一个换行符的字符串。这样你就可以写作了

('|"|`)[\s\S]*?\n[\s\S]*(\1)
但这将与整个示例相匹配,因为
[\s\s]*
也与字符串分隔符相匹配

你可能想试试

'[^']*?\n[^']*?'|"[^']*?\n[^']*?"|`[^']*?\n[^']*?`

但该字符串与转义引号不匹配。

您的输入字符串在双引号之间包含三个子字符串:

  • “不匹配”
  • “\n”
  • “需要\n匹配”
这意味着,您很难依赖于lookarounds,因为正则表达式引擎可能会将失败对的结尾
作为下一个双引号对的前导
(['“`])(?:(?!\1)。*\n[\s\s]*?\1
regex就是这个问题的一个例子

在这方面,更安全的做法是只使用正则表达式,然后过滤掉所有包含换行符的匹配项:

const text='“不匹配”\n“需要\n匹配”;
常数rx=/(['“`]).\1/gs;
console.log(text.match(rx).filter(x=>x.includes('\n'))
可能太复杂了

('|"|`)(?:(?:(?!\1).)+?\n)+(?:(?!\1).)+\1
细分:

┌─ 匹配其中的一个或多个
│                ┌─ 后跟一个或多个
│                │  非引号字符
│                │      ┌─ 比赛结束
┌────────┴─────────┐┌─────┴────┐┌┤  类似引号的字符
(“|“|`”)(?:(?:(?!\1)。+?\n)+(?:(?!\1)。+\1
└──┬──┘   │  │    ││     │
└────────────────────────────── 匹配类似于引号的字符
│  │    ││     │         并在第1组中捕获它
│  │    ││     │
│  └──┬─┘└─────│──────── 匹配任何字符
│     └────────│──────── 这不是一个类似引号的字符
└────┬─────────┘
└──────── 并匹配其中一个或多个,尽可能少
然后换行

不确定是否有办法消除重复,但是
“[^”]+\n[^”]*“[^']+\n[^']*'”[124;”[^`]+\ n[^`]*
应该可以很好地工作。请参阅。我建议在使用当前正则表达式得到结果后,过滤掉不包含
\n
的匹配项。您也可以使用
(['''''''''''''''''''`])
,而不是
('.\124''''>>)
而不是
[\s\s]
如果支持
s
标志,那么否决票的原因是什么?