gpt4 book ai didi

regex - 正则表达式中的 `(\S.*\S)` 和 `^\s*(.*)\s*$` 有什么区别?

转载 作者:行者123 更新时间:2023-12-03 14:20:04 34 4
gpt4 key购买 nike

我正在做 RegexOne 正则表达式教程,它有一个 question关于编写正则表达式以删除不必要的空格。
教程中提供的解决方案是

We can just skip all the starting and ending whitespace by not capturing it in a line. For example, the expression ^\s*(.*)\s*$ will catch only the content.


问题的设置确实表明使用开头的帽子和结尾的美元符号,因此这是他们想要的表达式是有道理的:

We have previously seen how to match a full line of text using the hat ^ and the dollar sign $ respectively. When used in conjunction with the whitespace \s, you can easily skip all preceding and trailing spaces.


也就是说,使用 \S相反,我想出了一个看起来更简单的解决方案 - (\S.*\S) .
我发现这个 SO 解决方案与教程中的解决方案相匹配 - Regex Email - Ignore leading and trailing spaces?我已经看到其他推荐相同格式的指南,但我正在努力寻找解释为什么 \S不好。
此外,这在他们的工具中验证为正确......那么,是否存在这样的情况,这不会像提供的解决方案一样有效?还是推荐的版本只是标准格式?

最佳答案

^\s*(.*)\s*$教程的解决方案是错的。捕获组.*是贪婪的,所以它会尽可能多地扩展,一直到行尾——它也会捕获尾随空格。 .*永远不会回溯,所以 \s*接下来的永远不会消耗任何字符。
https://regex101.com/r/584uVG/1
您的解决方案实际上只匹配行中的非空白内容要好得多,但在一些奇怪的情况下,它与中间的非空格字符不匹配。 (\S.*\S)将只捕获至少两个字符,而本教程的技术 (.*)如果输入由所有空格组成,则可能不会捕获任何字符。 (.*)也可以只捕获一个字符。
但是,鉴于您链接中的问题描述:

Occasionally, you'll find yourself with a log file that has ill-formatted whitespace where lines are indented too much or not enough. One way to fix this is to use an editor's search a replace and a regular expression to extract the content of the lines without the extra whitespace.


由此看来,仅匹配非空白内容(就像您正在做的那样)可能不会删除不需要的前导和尾随空格。本教程可能正在考虑指导您使用一种技术,该技术可用于将整行与特定模式匹配,然后仅用捕获的组替换该行,例如:
匹配 ^\s*(.*\S)\s*$ , 替换为 $1 : https://regex101.com/r/584uVG/2/
如果您有办法制作仅包含捕获的组(或所有完整匹配项)的新文本文件,那么您的技术将适用于该问题,例如:

const input = `   foo   
bar
baz
qux `;
const newText = (input.match(/\S(?:$|.*\S)/gm) || [])
.join('\n');
console.log(newText);


使用 \S而不是 .不错 - 如果知道特定位置必须与非空格字符匹配,而不是空格,请使用 \S更精确,可以使模式的意图更清晰,并且可以使糟糕的匹配更快地失败,并且在某些情况下还可以避免灾难性的回溯问题。这些模式没有回溯问题,但仍然是一个好习惯。

关于regex - 正则表达式中的 `(\S.*\S)` 和 `^\s*(.*)\s*$` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63084088/

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