多行正则表达式匹配

发布于 2022-09-13 00:34:15 字数 599 浏览 21 评论 0

let str = String.raw`
11111111111
/*\
|*| 这里后面可能是任意字符
|*| 3333333
|*| 这个前面像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
222222222222`

怎么写 JavaScript 正则表达式能匹配出

/*\
|*| 这里可能是任意字符
|*| 3333333
|*| 这个像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/

Update:
当有多个呢

let str = `
11111111111
/*\
|*| 这里后面可能是任意字符
|*| 3333333
|*| 这个前面像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
222222222222

11111111111
/*\
|*| 这里后面可能是任意字符
|*| 3333333
|*| 这个前面像双箭头的注释图案为固定的
|*| 双箭头不一定在行首,但一定并成一列
\*/
222222222222
`

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

带上头具痛哭 2022-09-20 00:34:15

题目中,|*| 后可能为任意字符,这个 “双箭头” 排成一列,所以不能简单地开头结尾匹配。

这个图案前面的字符一样的吧?如果各行前边字符不一样而只是长度一样那 JS 的正则根本整不了。这里假设各行前边字符只会是空格

const reg = /(?<=^|\n)(?<i>\s*)\/\*\\(\n\k<i>\|\*\|[^\n]*)*\n\k<i>\\\*\//g;
  1. (?<=^|\n),其中依序,

    1. ^|\n,匹配字符串开头或换行符。
    2. 上述包含于 (?<=...) 中,表示上述过程不计入匹配结果。
  2. (?<i>\s*),其中依序,

    1. \s,匹配空格
    2. *,表示上一步内的匹配可不进行,但尽可能多地进行。
    3. 上述包含于 (?<i>...) 中,记上述匹配结果为 i 组
  3. \/\*\\,匹配 /*\。(*/ 为正则特殊字符,/ 在以 // 方式声明的正则里也属特殊字符,因此都需要 \ 转义为普通字符。)
  4. (\n\k<i>\|\*\|[^\n]*)*,其中依序

    1. \n,匹配换行符。
    2. \k<i>匹配 i 组
    3. \|\*\|,匹配 |*|。(|* 为正则特殊字符,需要 \ 转义为普通字符。)
    4. [^\n]*,匹配 \n 之外的尽可能多的字符。
    5. 上述包含于 (...) 中,使之成为一个无具体名称的整体。
    6. *,表示上一步内的匹配可不进行,但尽可能多地进行。
  5. \n\k<i>\\\*\/,其中依序

    1. \n,匹配换行符。
    2. \k<i>匹配 i 组
    3. \\\*\/,匹配 \*/。(*/ 为正则特殊字符,/ 在以 // 方式声明的正则里也属特殊字符,因此都需要 \ 转义为普通字符。)

可以写一些 test cases,为了能在控制台里直接用,我包装在一起:

const testString = String.raw`
/*\
|*| 开头匹配
\*/

 /*\
|*| abc
|*| def
\*/

/*\
|*| \*/ 中途结束匹配
\*/

 /*\
 |*| 缩进匹配
 \*/

/*\
\*/
上为空白匹配

/*\
|*| 未衔接,不匹配

\*/

/*\
 |*| 未成一列,不匹配
\*/
`.trim();

结果:

[
  "/*\\\n|*| 开头匹配\n\\*/",
  "/*\\\n|*| \\*/ 中途结束匹配\n\\*/",
  " /*\\\n |*| 缩进匹配\n \\*/",
  " /*\\\n \\*/"
]

值得注意的是兼容性。(?<=...) 属于的零宽后发断言,(?<...>)\k<...> 属于的命名捕获组,在 JS 里是 ECMAScript 2018 (ES9) 才有的东西。

Lookbehind in JS regular expressions | Can I use...
JavaScript built-in: RegExp: Named capture groups | Can I use...

桃气十足 2022-09-20 00:34:15

\/\*\\[\s\S]+\\\*\/

\/\*\\[\s\S]+?\\\*\/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文