gpt4 book ai didi

JavaScript 正则表达式 : Unable to remove leading spaces in lookahead group in a multi line string

转载 作者:行者123 更新时间:2023-12-04 09:23:38 27 4
gpt4 key购买 nike

我正在尝试正则表达式 ^(?<=[\s]*namespace[\s]*---+\s+)(.|\s)+(?=\(\s*\d+\s*rows\))/gm从单列表格列表格式字符串中提取行项目。
但是在匹配中添加了前导空格。\s+前瞻和后视组中的运算符无济于事。引用以下:

x = `namespace
-------------------
itm1
itm2
itm3
itm4

(4 rows)
`
console.log(x.match(/^(?<=[\s]*namespace[\s]*---+\s+)(.|\s)+(?=\(\s*\d+\s*rows\))/gm)[0].split(/\s+/))
输出将前导和尾随空格作为单独的列表元素:
[ '', 'itm1', 'itm2', 'itm3', 'itm4', '' ]
但与 console.log(x.match(/^(?<=[\s]*namespace[\s]*---+\s+)(.|\s)+(?=\(\s*\d+\s*rows\))/gm)[0].trim().split(/\s+/)) <-- 注意 trim()之前 split(..) ,输出为:
[ 'itm1', 'itm2', 'itm3', 'itm4' ]
为什么 \s+在前瞻组末尾 (?<=[\s]*namespace[\s]*---+\s+)不删除 (.|\s)+ 捕获的所需匹配组之前的所有空格.

最佳答案

根本原因
正则表达式引擎从左到右解析字符串。
正则表达式在字符串的开头搜索匹配项,但没有找到后视模式,它就在那里失败,然后测试下一个位置,在 n 之间和 anamespace .依此类推,直到 ------------------- 之后的换行符.
\n 之后的位置,换行符,有一个lookbehind模式匹配,\s+在你的lookbehind 的末尾找到\s+ 所需的空格图案。然后,模式的其余部分也找到匹配项。因此,您的结果中有 15 个前导空格。
解决方案
使用消费模式。也就是说,使用捕获组。或者,确保您的消费部分以非空白字符开头。
因此,

const x = "namespace\n-------------------\n               itm1\n     itm2\n  itm3\n               itm4\n               \n(4 rows)\n";
console.log(
x.match(/(?<=^\s*namespace\s*---+\s+)\S.*?(?=\s*\(\s*\d+\s*rows\))/gms)[0].split(/\s+/)
);

或者,使用捕获组:

const x = "namespace\n-------------------\n               itm1\n     itm2\n  itm3\n               itm4\n               \n(4 rows)\n";
console.log(
x.match(/^\s*namespace\s*---+\s+(\S.*?)(?=\s*\(\s*\d+\s*rows\))/ms)[1].split(/\s+/)
);

关于正则表达式的注意事项:
  • 我替换 (.|\s)+仅用 .模式,但添加了 s标志,以便 .可以匹配换行符。请勿使用 (.|\s)* , (.|\n)* , 或 (.|[\r\n])* ,这些是非常低效的正则表达式模式
  • 我加了 \s*在正向前瞻的开始,以便可以从匹配中删除尾随的空格。
  • 我也用了一个懒点,.*? , 在两种模式中匹配两个字符串之间的最少字符数。
  • 关于JavaScript 正则表达式 : Unable to remove leading spaces in lookahead group in a multi line string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63057983/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com