使用正则表达式匹配修剪字符串

时间:2010-03-05 12:12:47

标签: regex

我必须使用一种残缺的工具,它不提供任何方法来修剪从字符串引出尾随空格。它确实有.NET样式正则表达式,但只实现匹配,而不是替换。所以,我(我自己出乎意料)用这个似乎有效的正则表达式出现了......但是我不完全理解为什么会这样做: - )

$trimmed = regex/[^ ].*[^ ]/ ($original_string)

为什么这样做有效,它是否真的适用于所有情况,如果你只有正则表达式匹配(甚至无法捕获组匹配:()?有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

它应该可以正常工作,除非只有一个字符被空格包围。

您的模式搜索:

  1. 非空格字符[^ ]
  2. 任意种类的零个或多个字符,尽可能多(贪婪匹配).*
  3. 非空格字符[^ ]
  4. 因此,如果没有至少两个非空格字符(1和3),则模式根本不匹配。

    您应该使用\b代替[^ ],它将匹配任何“字边界”,但长度为零,不需要两个非空格字符:

    \b.*\b
    

答案 1 :(得分:2)

它的工作方式如下:[^ ]将匹配第一个非空格字符,.*将匹配任何内容,[^ ]将再次匹配非空格字符。由于正则表达式是贪婪的,因此返回最长的匹配,因此在这种情况下,在末尾有两个非空格的最长字符串有效地修剪$original_string的开头和结尾处的空格。

关于正则表达式的一个很好的教程是here,它教你贪婪和懒惰的匹配,这是理解和优化正则表达式的关键。它还教你如何在字符之间进行匹配,这是你想要做的事情(参见Martin关于\ b的答案)。