【正则表达式 提高】环视,中文字处理

在正则规范中,我们可能会看到(?: pattern), (?!pattern ) (?<! pattern)  (?<=pattern), (?=pattern),这些叫做环视。

(?: pattern)非捕获匹配, 说白了就是系统不会捕获这个子表达式

(?!pattern)顺序否定环视,表示所在位置右侧不能匹配Expression

举例:(?!\|), 表示在这个位置的右侧不能出现 | 如果出现 | 则不会匹配。

 (?=pattern)顺序肯定环视, 表示所在位置的右侧能够匹配Expression

(?<! pattern)  :逆序否定环视, 表示所在位置左侧不能匹配Expression

(?<=pattern): 逆序肯定环视, 表示所在位置左侧能够匹配Expression

 

                //环视的举例

                $regex = '/

               

                                ^host = (?<!\.)([\d.]+)(?!\.)   (?#主机地址)

                                \|

                                ([\w!@#$%^&/*()_-+\])           (?#用户名)

                                \|

                                ([\w!@#$%^&*()_+\-])            (?#密码)

                                (?!\|)$

                /ix';

\x: 可以匹配中文字符

 

下面的程序是查找一段string中有多少中文字,有多少数字和字母。

/[\x{4e00}-\x{9fa5}]/iu
复制代码
<?php

    //查找出游多少个汉字,多少个英文字母,多少数字
    $str = "awefawe66565awefaw文字母ef";
    //汉字按utf-8编码来说,它的范围是多少? 16进制  \x4e00-\x9fa5
    
    $reg1 = '/[\x{4e00}-\x{9fa5}]/iu';  //u is utf-8
    //{}: ground char form one pattern
    preg_match_all($reg1, $str, $res);
    
    echo "There are ".count($res[0])." Chinese letters";
    echo "<pre>";
    print_r($res);
    echo "</pre>";
    
    //a-zA-Z
    $reg2 = '/[a-zA-Z]/i';
    preg_match_all($reg2, $str, $res);
    
    echo "There are ".count($res[0])." Chinese letters";
    echo "<pre>";
    print_r($res);
    echo "</pre>";
    
    
    //0-9
    $reg3 = '/[0-9]/i';
    preg_match_all($reg3, $str, $res);
    
    echo "There are ".count($res[0])." Chinese letters";
    echo "<pre>";
    print_r($res);
    echo "</pre>";
复制代码

 

 

题:结巴程序

我给出一个字符串,“我要要学学学...php”把他换成"我要学php"

复制代码
<?php
    $str = "我要要学学学...php";
    
    //查找连续出现的相同中文字,并去匹配所有
    $reg4 = '/([\x{4e00}-\x{9fa5}])\1+/iu';
    preg_match_all($reg4, $str, $res);    

    /*
        Array
        (
            [0] => Array
                (
                    [0] => 要要
                    [1] => 学学学
                )

            [1] => Array
                (
                    [0] => 要
                    [1] => 学
                )

        )
    */
    
    //单独提取出res[1]中的内容作为replacement和pattern去替换str中的内容
    for($i = 0; $i < count($res[1]); $i++){
    
        $pattern = '/('.$res[1][$i].')\1+/iu';
        $replacement = $res[1][$i];
        $str = preg_replace($pattern, $replacement, $str);
    }//除去了所有结巴的中文字
    
    //除去...
    //...出现的次数必须大于或者等于2次
    $reg5 = '/(\.)\1+/i';
    $str = preg_replace($reg5, '', $str);
    
    echo "<pre>";
    print_r($str);
    echo "</pre>";    
 ?>
复制代码

 

 

posted @   Zhentiw  阅读(303)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示