拆分字符串中的第一个空格和最后一个空格并将输出的大小限制为3

Posted

技术标签:

【中文标题】拆分字符串中的第一个空格和最后一个空格并将输出的大小限制为3【英文标题】:Split the first space and the last space in a string and limit the size of output in 3 【发布时间】:2015-04-14 01:57:02 【问题描述】:

假设我有一个字符串:

ABC DEF SASF  123 (35)

我的预期输出如下:

Array (
     [0] => ABC
     [1] => DEF SASF  123
     [2] => (35)
)

我正在尝试使用 $str = preg_split("/(^\S+\s+)|\s+(?=\S+$)/",$str, 3); 执行此操作,但当前的问题是此 RegEx 将替换 $str[0] 中的内容,就像

Array (
     [0] => 
     [1] => DEF SASF  123
     [2] => (35)
)

如何修改 RegEx 以输出我的预期结果?

在线示例:https://www.regex101.com/r/rK5lU1/2

【问题讨论】:

【参考方案1】:

只需根据下面的正则表达式拆分您的输入字符串。

^\S+\K\s+|\s+(?=\S+$)

只需匹配第一个单词,然后通过在 \S+ 旁边添加 \K 将其丢弃。然后匹配以下一个或多个空格。 | 或者在最后一个单词之前再匹配一个空格。 \S+ 匹配一个或多个非空格字符。

DEMO

$str = "ABC DEF SASF  123 (35)";
$match = preg_split('~^\S+\K\s+|\s+(?=\S+$)~', $str);
print_r($match);

输出:

Array
(
    [0] => ABC
    [1] => DEF SASF  123
    [2] => (35)
)

【讨论】:

【参考方案2】:
^(\S+)\s+|\s+(?=\S+$)

尝试以此分割。示例代码。

preg_split('/^(\S+)\s+|\s+(?=\S+$)/', 'ABC DEF SASF  123 (35)', -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)

或者只是匹配并抓取捕获而不是拆分。

^(\S+)\s+(.*?)\s+(\S+)$

See demo

$re = "/^(\\S+)\\s+(.*?)\\s+(\\S+)$/";
$str = "ABC DEF SASF 123 (35)";

preg_match_all($re, $str, $matches);

【讨论】:

如果没有这些标志,您的代码将无法工作。不知道为什么你甚至什么都不说。 接受的答案比这个解决方案 IMO 更容易理解和简单。 @user3571945 是的,你已经同意了。无论如何,学习不止一种方式:)

以上是关于拆分字符串中的第一个空格和最后一个空格并将输出的大小限制为3的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式基于空格引号和括号进行拆分

使用python中的最后一个空格分割字符串列表

拆分数据框的列并将它们重新组合为一列而不显示空格

R 使用 tidyr::separate 在最后一个空格字符处拆分字符串

最后一个单词的长度

切片用法——去空格