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])/;