按不同的定界字符序列拆分字符串

问题描述 投票:0回答:4

我有以下字符串,格式为

country:
Cum name
,
Extra info
.

Asia: Asian Cup - Play Offs
Asia: Asian Cup
Asia: World Cup - Qualification - First Stage
Australia: A-League
Belgium: Jupiler League - Championship Group
Brazil: Série A

我遇到的问题是如何使用正则表达式分隔每行的信息。

更具体的,我喜欢从第一行导出以下信息:

[ Asia, Asian Cup, Play Offs ]

从第二个信息

[ Asia, Asian Cup ]

等等。

目前我尝试了以下声明:

^([\w]+\:\s+)[^\-]+(?!\-\s)+

没有完成,我不知道如何继续这个。我的主要问题是我不知道如何否定声明的一部分。

那么,解决这个问题的方法是什么?

php regex text-parsing preg-split delimited
4个回答
3
投票

您可以使用

explode

$lines = ['Asia: Asian Cup - Play Offs',
          'Asia: Asian Cup',
          'Asia: World Cup - Qualification - First Stage',
          'Australia: A-League',
          'Belgium: Jupiler League - Championship Group',
          'Brazil: Série A'];

$results = array_map(function ($i) {
    $ret = [];
    list($ret[0], $tmp) = explode(': ',$i, 2);
    return array_merge($ret, explode(' - ', $tmp, 2));
}, $lines);

print_r($results);

2
投票

您可以在 PHP 中尝试这个正则表达式:

/^(\p{Lu}\p{L}*):\h*(.+?)(?:\h-\h(.+))?$/mu

正则表达式演示


1
投票

首先,在

\n
上展开你的字符串,然后你可以使用以下正则表达式:

([\w\s]+): ([\w ]+)(?:- ?([\w -]+))?

在这里解释https://regex101.com/r/lV7lT0/1


0
投票

这对我来说看起来并不复杂。您希望在冒号后跟一个空格或空格-连字符-空格处拆分。

preg_split()
会很乐意效劳。

代码:(演示

$lines = [
    'Asia: Asian Cup - Play Offs',
    'Asia: Asian Cup',
    'Asia: World Cup - Qualification - First Stage',
    'Australia: A-League',
    'Belgium: Jupiler League - Championship Group',
    'Brazil: Série A'
];

var_export(
    array_map(
        fn($v) => preg_split('/: | - /', $v),
        $lines
    )
);

输出:

array (
  0 => 
  array (
    0 => 'Asia',
    1 => 'Asian Cup',
    2 => 'Play Offs',
  ),
  1 => 
  array (
    0 => 'Asia',
    1 => 'Asian Cup',
  ),
  2 => 
  array (
    0 => 'Asia',
    1 => 'World Cup',
    2 => 'Qualification',
    3 => 'First Stage',
  ),
  3 => 
  array (
    0 => 'Australia',
    1 => 'A-League',
  ),
  4 => 
  array (
    0 => 'Belgium',
    1 => 'Jupiler League',
    2 => 'Championship Group',
  ),
  5 => 
  array (
    0 => 'Brazil',
    1 => 'Série A',
  ),
)

如果您的输入数据实际上是一段文本,那么只需使用

\R
在换行符上将其拆分。 (演示

preg_split('/\R/', $text)
© www.soinside.com 2019 - 2024. All rights reserved.