Regex 在Perl中从字符串捕获特定字符

Regex 在Perl中从字符串捕获特定字符,regex,perl,file-io,Regex,Perl,File Io,我有一个包含以下内容的文件: HFH_F_OPL_J0 ;comment1 HIJ_I_AAA_V2_DSD ;comment2 ALE_H_FB_V1 ;comment3 ZXZPOIF_P

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

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})(.*)\;/ 

没有给出正确的结果

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

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


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

这个简短的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
如果您想稍微安全一点,那么可以使用字符类而不是点,这会将我的代码行更改为

say $1 if /_([HIFPLS])/;
输出与原始代码的输出相同

F
I
H
P
S
say $1 if /_([HIFPLS])/;