gpt4 book ai didi

php - 标签分隔字符串的正则表达式

转载 作者:可可西里 更新时间:2023-11-01 13:43:04 25 4
gpt4 key购买 nike

我有一堆这样的字符串:

a#aax1aay222b#bbx4bby555bbz6c#mmm1d#ara1e#abc

我需要做的是根据 hashtag 位置将它们拆分为如下所示:

Array
(
[0] => A
[1] => AAX1AAY222
[2] => B
[3] => BBX4BBY555BBZ6
[4] => C
[5] => MMM1
[6] => D
[7] => ARA1
[8] => E
[9] => ABC
)

因此,如您所见,hashtag 后面的字符被捕获,加上 hashtag 之后的所有内容就在下一个 char+hashtag 之前。

我有以下 RegEx,当我在每个部分的末尾都有一个 numeric 值时,它工作正常。

这是 RegEx 设置:

preg_split('/([A-Z])+#/', $text, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

它可以很好地处理这样的事情:

C#mmm1D#ara1

但是,如果我把它改成这样(删除数字):

C#mmmD#ara

然后就是这个结果,不好:

    Array
(
[0] => C
[1] => D
)

我看过 this 问题和 this 问题,它们很相似,但没有一个对我有用。

所以,我的问题是,为什么只有在它后面跟有数字时它才有效?我该如何解决?

在这里你可以看到我有的一​​些示例字符串:

a#123b#abcc#def456         // A:123, B:ABC, C:DEF456
a#abc1def2efg3b#abcdefc#8 // A:ABC1DEF2EFG3, B:ABCDEF, C:8
a#abcdef123b#5c#xyz789 // A:ABCDEF123, B:5, C:XYZ789

附言字符串不区分大小写。

附言如果你想过这些字符串到底是什么,它们是用户提交的问卷答案,我不能对它们做任何事情,比如重构,因为它们已经存储,只需要继续。

为什么不使用 explode?

如果您查看我的示例,您会发现我还需要在 # 之前捕获字符。如果您认为 explode() 可行,请同时发布输出,谢谢!

更新

我们是否应该关注为什么 /([A-Z])+#/ 仅在包含数字时才有效?谢谢。

最佳答案

而不是使用 preg_split() , 决定你想匹配什么:

  1. 一组“单词”,如果后跟 <any-char>#<end-of-string> .

  2. 如果紧跟 # 的字符.

    $str = 'a#aax1aay222b#bbx4bby555bbz6c#mmm1d#ara1e#abc';

    preg_match_all('/\w+(?=.#|$)|\w(?=#)/', $str, $matches);

Demo

这个表达式使用了两个先行断言。结果在 $matches[0] 中.

更新

另一种看待它的方式是这样的:

preg_match_all('/(\w)#(\w+)(?=\w#|$)/', $str, $matches);

print_r(array_combine($matches[1], $matches[2]));

每个条目都以一个字符开头,后跟一个散列,然后是 X 个字符,直到遇到字符串的结尾或下一个条目的开头。

输出是这样的:

Array
(
[a] => aax1aay222
[b] => bbx4bby555bbz6
[c] => mmm1
[d] => ara1
[e] => abc
)

关于php - 标签分隔字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16581023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com