Regex 正则表达式中的“(\S.*\S)”和“^\S*(.*)\S*$”之间有什么区别?

Regex 正则表达式中的“(\S.*\S)”和“^\S*(.*)\S*$”之间有什么区别?,regex,Regex,我正在做RegexOne正则表达式教程,它有一个关于编写正则表达式以删除不必要的空格的教程 本教程中提供的解决方案是 我们可以通过不在一行中捕获来跳过所有的起始和结束空格。例如,表达式^\s*(.*)\s*$将只捕获内容 问题的设置确实表明在开头使用了帽子,在结尾使用了美元符号,因此这是他们想要的表达: 我们之前已经了解了如何分别使用hat^和美元符号$匹配全文。当与空格\s结合使用时,您可以轻松跳过所有前面和后面的空格 也就是说,使用\S,我可以想出一个看起来更简单的解决方案-(\S.*\S)

我正在做RegexOne正则表达式教程,它有一个关于编写正则表达式以删除不必要的空格的教程

本教程中提供的解决方案是

我们可以通过不在一行中捕获来跳过所有的起始和结束空格。例如,表达式
^\s*(.*)\s*$
将只捕获内容

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

我们之前已经了解了如何分别使用hat^美元符号$匹配全文。当与空格\s结合使用时,您可以轻松跳过所有前面和后面的空格

也就是说,使用
\S
,我可以想出一个看起来更简单的解决方案-
(\S.*\S)

我发现这个解决方案与本教程中的解决方案非常匹配——我也看到过其他指南推荐相同的格式,但我正在努力寻找解释为什么
\S
不好


此外,这在他们的工具中验证为正确。。。那么,是否存在这样的情况,即这种方法不能像提供的解决方案那样有效?或者推荐的版本只是一种标准格式?

教程中的
^\s*(.*)\s*$
解决方案是错误的。捕获组
*
是贪婪的,因此它将尽可能地扩展,一直扩展到行的末尾-它也将捕获尾随空格。
*
永远不会回溯,因此后面的
\s*
永远不会使用任何字符

您的解决方案在实际匹配行中的非空白内容方面要好得多,但是有两个奇数的情况,它与中间的非空格字符不匹配。code>(\S.*\S)将只捕获至少两个字符,而本教程的

(.*)
技术可能无法捕获任何字符(如果输入由所有空格组成)<代码>(*)也可以只捕获单个字符

但是,根据链接中的问题描述:

有时,您会发现自己的日志文件中有格式错误的空格,其中行缩进过多或不足。解决这个问题的一种方法是使用编辑器的搜索、替换和正则表达式来提取行的内容,而不需要额外的空格

因此,仅匹配非空白内容(就像您正在做的那样)可能不会删除不需要的前导和尾随空格。本教程可能在考虑引导您使用一种技术,该技术可用于将整条线与特定图案匹配,然后仅用捕获的组替换该线,如:

匹配
^\s*(.*\s)\s*$
,替换为
$1

如果您有办法创建一个只包含捕获的组(或所有完整匹配项)的新文本文件,那么您的技术将在出现问题时起作用,例如:

const input=`foo
酒吧
巴兹
qux`;
常量newText=(input.match(/\S(?:$|.*\S)/gm)|【】)
.join('\n');

console.log(newText)
如果去掉两端空白后的剩余文本为空或由单个字符组成,则这两个表达式将产生不同的结果。您的版本至少需要两个匹配的
\S
,才能完全匹配。@WiktorStribiżew我真的不明白这是一个重复的版本。我在问为什么,不是为了有人给我密码。这是一个非常有用的资源,但它根本不能解决我的问题-根据这里的答案,我引用的教程中建议的答案实际上是错误的。。。所以-再次-我认为副本是不正确的。为这些基本模式提供了解释。无需一次又一次地询问
\s
\s
匹配的内容。我感谢您的详尽回答!我特别感谢你的解释,希望与整条线路相匹配,而不仅仅是其中的一部分。这更清楚地说明了为什么缩写版本(例如,
^\s*(.*\s)
不起作用。但是,我认为,它可以避免只捕获两个或更多角色的问题吗?我还感谢(可能是无意中)对regex101工具的介绍。我听说过它,但还没有看到它在使用中的例子,所以我也很感激。