【问题标题】:Regex to split a string only by the last whitespace character正则表达式仅按最后一个空格字符拆分字符串
【发布时间】:2010-12-04 14:11:51
【问题描述】:

希望这应该是一个快速而简单的方法,使用 PHP 我试图将一个字符串拆分为一个数组,但只使用最后一个空格实例。到目前为止,我...

$str="hello this is     a    space";
$arr=preg_split("/\s+/",$str);
print_r($arr);

Array ( [0] => hello [1] => this [2] => is [3] => a [4] => space ) 

...由所有空白实例分割。

如何扩展此正则表达式以仅按最后一个空白实例进行拆分?成为……

Array ( [0] => hello this is     a [1] => space ) 

提前感谢您的帮助!

【问题讨论】:

    标签: php regex string split


    【解决方案1】:

    试试:

    $arr=preg_split("/\s+(?=\S*+$)/",$str);
    

    编辑

    简短说明:

    (?= ... ) 称为阳性look ahead。例如,a(?=b) 将仅匹配单个 'a',如果下一个字符(它右侧的字符)是 'b'。请注意,'b' 不是匹配的一部分!

    \S 只是character class [^\s] 的简写。换句话说:它匹配除空白字符之外的单个字符。 * 之后的 + 构成字符类 \S possessive

    最后,$ 表示字符串的结尾。

    回顾一下,完整的正则表达式\s+(?=\S*+$) 用简单的英语读起来如下:

    仅当在那些空白字符前面看零个或多个除空白字符之外的字符,然后是字符串的结尾时,才匹配一个或多个空白字符。

    【讨论】:

    • 太好了,谢谢,效果很好。为便于理解,您能否解释一下该表达式的 '(?=\S*+$)' 部分是如何工作的?
    • 巴特很棒,谢谢。如果可以的话,我会给你更多的积分!
    • 谢谢先生!解释也很详细!
    • 只有当我删除公式中的 + 或 * 时,我才能使它工作。我知道拥有属性在 JavaScript 中不可用!但它确实有帮助。谢谢
    • @Adam 如果有超过 1 个这样的空格:"a b c",它将被拆分为["a", "b", "c"] 而不是["a b", "c"]
    【解决方案2】:

    这应该可行:

    $str="hello this is a  space";
    
    preg_match('~^(.*)\s+([^\s]+)$~', $str, $matches);
    $result = array($matches[1], $matches[2]);
    

    你可以不用正则表达式:

    $parts = array_map('trim', explode(' ', $str));
    $result = array(
        implode(' ', array_slice($parts, 0, -1)),
        end($parts)
    );
    

    $lastSpace = strrpos($str, ' ');
    $str1 = trim(substr($str, 0, $lastSpace));
    $str2 = trim(substr($str, $lastSpace));
    $result = array( $str1, $str2 );
    

    【讨论】:

    • 感谢汤姆,两个聪明的替代解决方案。
    【解决方案3】:

    如果\S 之后的*+ 重复了?仅/\s+(?=\S+$)//\s+(?=\S*$)/ 就足够了,这取决于需要。

    【讨论】:

    • 不重复 - *+ 是一个命令,\S*+ 通常比 \S* 更有效。阅读“占有量词”了解更多详情。
    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多