gpt4 book ai didi

PHP regex - 计算单词前后感叹号的数量

转载 作者:行者123 更新时间:2023-12-03 08:07:31 24 4
gpt4 key购买 nike

我需要帮助来改进 PHP 中的正则表达式,旨在计算单词前后出现的感叹号的数量。在这种情况下,单词可以包含除空格(甚至感叹号)之外的任何字符,如下所示(我显示了预期的“之前、之后”计数):

!!!!Hi!! => 4, 2
!!!!Hi => 4, 0
!Hi!!! => 1, 3
!easdf.kjaf!! => 1, 2
!hjdfa!sdfk!jaf!! => 1, 2
!,!!!!!fdgsdfg!!sdgj => 1, 0
!!!,!ksfgfdg!jkft!!! => 3, 3

如何对正则表达式进行编码,以便对于之前,当达到一些非感叹号时,它停止寻找连续的感叹号,并在仅剩下感叹号时开始对之后进行计数?

棘手的部分是标点符号出现在单词中。这些应该被忽略,它们被视为单词的一部分。

这是我所在的位置:

 preg_match_all('/(!*)\b(\S+)\b(!*)/', $w, $m);

$w是单词(如上图),$m是匹配数组

举个例子,“!!嗨!”将导致 $m 等于

Array
(
[0] => Array
(
[0] => !!Hi!
)
[1] => Array
(
[0] => !!
)
[2] => Array
(
[0] => Hi
)
[3] => Array
(
[0] => !
)
)

这是正确的,也是我正在寻找的。然而,当标点符号开始或结束单词时,事情就会变得困惑,正则表达式 anchor “\b”不会将其识别为单词的一部分(正如本练习中所定义的那样)。这是解析单词“!!!!!!!!!xd.sfgdx!!!,!!”失败的示例

Array
(
[0] => Array
(
[0] => !!!!!!!!xd.sfgdx!!!
)
[1] => Array
(
[0] => !!!!!!!!
)
[2] => Array
(
[0] => xd.sfgdx
)
[3] => Array
(
[0] => !!!
)
)

请帮忙。

最佳答案

您只需要 anchor (^ 表示开始,$ 表示结束)以及中间的任何内容。对于 anchor ,如果中间的 ! 不在两端,则不会匹配。这可能是第一次尝试;

/^(!*).*(!*)$/

这里中间的任何内容 (.*) 的问题在于它是贪婪的,并且优先于最后一组 (!*)。中间的任何东西都会匹配到最后,而该组什么也没有。修复起来很简单,只需使中间不贪婪即可:

/^(!*).*?(!*)$/

现在它将尽可能匹配开头的任何 !,然后逐步匹配中间的任何内容,直到下一个条件匹配(最后的 ! )。

关于PHP regex - 计算单词前后感叹号的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41507183/

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