我必须使用一种残缺的工具,它不提供任何方法来修剪从字符串引出尾随空格。它确实有.NET样式正则表达式,但只实现匹配,而不是替换。所以,我(我自己出乎意料)用这个似乎有效的正则表达式出现了......但是我不完全理解为什么会这样做: - )
$trimmed = regex/[^ ].*[^ ]/ ($original_string)
为什么这样做有效,它是否真的适用于所有情况,如果你只有正则表达式匹配(甚至无法捕获组匹配:()?有更好的方法吗?
答案 0 :(得分:3)
它应该可以正常工作,除非只有一个字符被空格包围。
您的模式搜索:
[^ ]
.*
[^ ]
因此,如果没有至少两个非空格字符(1和3),则模式根本不匹配。
您应该使用\b
代替[^ ]
,它将匹配任何“字边界”,但长度为零,不需要两个非空格字符:
\b.*\b
答案 1 :(得分:2)
它的工作方式如下:[^ ]
将匹配第一个非空格字符,.*
将匹配任何内容,[^ ]
将再次匹配非空格字符。由于正则表达式是贪婪的,因此返回最长的匹配,因此在这种情况下,在末尾有两个非空格的最长字符串有效地修剪$original_string
的开头和结尾处的空格。
关于正则表达式的一个很好的教程是here,它教你贪婪和懒惰的匹配,这是理解和优化正则表达式的关键。它还教你如何在字符之间进行匹配,这是你想要做的事情(参见Martin关于\ b的答案)。