尝试使用正则表达式仅匹配多行字符串。但下面的正则表达式匹配单行和多行。我如何使用正则表达式来实现这一点?
正则表达式
('|"|`)[\s\S]*?(\1)
测试字符串
"not a match"
"need
to
match"
答案 0 :(得分:2)
您的输入字符串在双引号之间包含三个潜在的子字符串:
"not a match"
"\n"
"need\nto\nmatch"
这意味着,您几乎不能依赖环视,因为正则表达式引擎有可能选择失败对的结尾 "
作为下一个双引号对的前导 "
。 (['"`])(?:(?!\1).)*\n[\s\S]*?\1
正则表达式是此问题的illustration。
在这方面,使用正则表达式然后过滤掉所有包含换行符的匹配项要安全得多:
const text = '"not a match"\n"need\nto\nmatch"';
const rx = /(['"`]).*?\1/gs;
console.log( text.match(rx).filter(x => x.includes('\n')) )
答案 1 :(得分:0)
多行字符串是至少包含一个换行符的字符串。所以你可以写
('|"|`)[\s\S]*?\n[\s\S]*(\1)
但这将匹配您的整个示例,因为 [\s\S]*
也匹配字符串分隔符。
你可能想试试
'[^']*?\n[^']*?'|"[^']*?\n[^']*?"|`[^']*?\n[^']*?`
但是那个不匹配转义引号。
答案 2 :(得分:-1)
也许 this 太复杂了?
('|"|`)(?:(?:(?!\1).)+?\n)+(?:(?!\1).)+\1
分解:
┌─ matches 1 or more of this
│ ┌─ followed by one or more
│ │ non-quote-like characters
│ │ ┌─ matches closing
┌────────┴─────────┐┌─────┴────┐┌┤ quote-like characters
('|"|`)(?:(?:(?!\1).)+?\n)+(?:(?!\1).)+\1
└──┬──┘ │ │ ││ │
└────────────────────────────── matches opening quote-like character
│ │ ││ │ and captures it in group 1
│ │ ││ │
│ └──┬─┘└─────│──────── matches any character
│ └────────│──────── which is not an quote-like character
└────┬─────────┘
└──────── and matches 1 or more of them, as few as possible
followed by line break