perl查找、截取字符的正则表达式

时间:2021-06-18 12:20:37
现在要将文件中的每条记录中的指定字符串截取出来具体如下:
记录:
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=         
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=       
现在,我想要的是
第一条记录:XZ-WAPGW,2+8618091019685, , , ,
第二条记录(第二条记录中没有Pesu_ID= 这个内容但是我想取的是如果没有这个内容,
我就将它自动补一个空格XZ-WAPGW,2+8618091019685, , , ,  
像这种正则表达式如何写呢?我才开始学习。请各位指导一下。谢谢1

4 个解决方案

#1


while (<DATA>) {
    if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
        print "$1, $2$3, $4, $5, $6, $7\n";
    }
}
__DATA__
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=         
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=        

#2


引用 1 楼  的回复:
Perl code
while (<DATA>) {
    if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
        print "$1, $2$3……


这个方法是正确的,谢谢您,但是还有个问题,如果一个文件记录多了之后,好像生成的记录会少一些,1到几十条不等,不知道啥原因。

#3


引用 2 楼  的回复:
引用 1 楼  的回复:

Perl code
while (<DATA>) {
if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
print "$1……


清理下缓存buffer.


#4


牛人写的代码就是牛。

#1


while (<DATA>) {
    if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
        print "$1, $2$3, $4, $5, $6, $7\n";
    }
}
__DATA__
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019685         Pesu_ID=         SP_Name=         UserType=         IMEI=         
WAP_GATEWAY_ID=XZ-WAPGW         BEARER_TYPE=2         USER_MSISDN=+8618091019686         SP_Name=         UserType=         IMEI=        

#2


引用 1 楼  的回复:
Perl code
while (<DATA>) {
    if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
        print "$1, $2$3……


这个方法是正确的,谢谢您,但是还有个问题,如果一个文件记录多了之后,好像生成的记录会少一些,1到几十条不等,不知道啥原因。

#3


引用 2 楼  的回复:
引用 1 楼  的回复:

Perl code
while (<DATA>) {
if (/WAP_GATEWAY_ID=(\S+)\s+BEARER_TYPE=(\d+)\s+USER_MSISDN=(\+\d+)\s+(?:Pesu_ID=(\S*?)\s+)?SP_Name=(\S*?)\s+UserType=(\S*?)\s+IMEI=(\S*?)/i) {
print "$1……


清理下缓存buffer.


#4


牛人写的代码就是牛。