从Perl中的字符串捕获特定字符

时间:2016-01-06 05:48:05

标签: regex perl file-io

我有一个包含以下内容的文件:

HFH_F_OPL_J0                                       ;comment1
HIJ_I_AAA_V2_DSD                                   ;comment2
ALE_H_FB_V1                                        ;comment3
ZXZPOIF_P                                              ;comment4
RST0DREK_S                                              ;comment5

我需要匹配单个字符,始终出现在第一个下划线之后,并且始终只有[H,I,F,P,L,S] 中的一个

这是什么正则表达式?

/(\w{3,})_([S|I|P|F|L|H]{1})(.*)\;/ 

没有给出正确的结果。

2 个答案:

答案 0 :(得分:1)

使用主播并将第一个\w更改为[A-Z],因为\w也应与_匹配。现在,从组索引1中获取所需的字符。

/^[A-Z]{3,}_([SIPFLH]).*;/ 

/^[^_]{3,}_\K[SIPFLH](?=.*;)/ 

DEMO

答案 1 :(得分:1)

如果您信任您的数据,那么没有理由在第一个下划线之后检查字符的值 - 您可以抓住并使用它

这个简短的Perl程序演示了

use strict;
use warnings 'all';
use feature 'say';

while ( <DATA> ) {
    say $1 if /_(.)/;
}

__DATA__
HFH_F_OPL_J0                                       ;comment1
HIJ_I_AAA_V2_DSD                                   ;comment2
ALE_H_FB_V1                                        ;comment3
ZXZPOIF_P                                              ;comment4
RST0DREK_S

输出

F
I
H
P
S

如果你想要稍微安全一点,那么你可以使用一个字符类而不是一个点,这会改变我的代码行

say $1 if /_([HIFPLS])/;

输出与原始代码的输出相同