多行正则表达式匹配
let str = String.raw`
11111111111
/*\
|*| 这里后面可能是任意字符
|*| 3333333
|*| 这个前面像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
222222222222`
怎么写 JavaScript
正则表达式能匹配出
/*\
|*| 这里可能是任意字符
|*| 3333333
|*| 这个像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
Update:
当有多个呢
let str = `
11111111111
/*\
|*| 这里后面可能是任意字符
|*| 3333333
|*| 这个前面像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
222222222222
11111111111
/*\
|*| 这里后面可能是任意字符
|*| 3333333
|*| 这个前面像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
222222222222
`
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
题目中,
|*|
后可能为任意字符,这个 “双箭头” 排成一列,所以不能简单地开头结尾匹配。这个图案前面的字符一样的吧?如果各行前边字符不一样而只是长度一样那 JS 的正则根本整不了。这里假设各行前边字符只会是空格:
(?<=^|\n)
,其中依序,^|\n
,匹配字符串开头或换行符。(?<=...)
中,表示上述过程不计入匹配结果。(?<i>\s*)
,其中依序,\s
,匹配空格。*
,表示上一步内的匹配可不进行,但尽可能多地进行。(?<i>...)
中,记上述匹配结果为 i 组。\/\*\\
,匹配/*\
。(*
、/
为正则特殊字符,/
在以//
方式声明的正则里也属特殊字符,因此都需要\
转义为普通字符。)(\n\k<i>\|\*\|[^\n]*)*
,其中依序\n
,匹配换行符。\k<i>
,匹配 i 组。\|\*\|
,匹配|*|
。(|
,*
为正则特殊字符,需要\
转义为普通字符。)[^\n]*
,匹配\n
之外的尽可能多的字符。(...)
中,使之成为一个无具体名称的整体。*
,表示上一步内的匹配可不进行,但尽可能多地进行。\n\k<i>\\\*\/
,其中依序\n
,匹配换行符。\k<i>
,匹配 i 组。\\\*\/
,匹配\*/
。(*
、/
为正则特殊字符,/
在以//
方式声明的正则里也属特殊字符,因此都需要\
转义为普通字符。)可以写一些 test cases,为了能在控制台里直接用,我包装在一起:
结果:
值得注意的是兼容性。
(?<=...)
属于的零宽后发断言,(?<...>)
、\k<...>
属于的命名捕获组,在 JS 里是 ECMAScript 2018 (ES9) 才有的东西。Lookbehind in JS regular expressions | Can I use...
JavaScript built-in: RegExp: Named capture groups | Can I use...
\/\*\\[\s\S]+\\\*\/
\/\*\\[\s\S]+?\\\*\/