我有一个包含以下内容的文件:
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})(.*)\;/
没有给出正确的结果。
答案 0 :(得分:1)
使用主播并将第一个\w
更改为[A-Z]
,因为\w
也应与_
匹配。现在,从组索引1中获取所需的字符。
/^[A-Z]{3,}_([SIPFLH]).*;/
或
/^[^_]{3,}_\K[SIPFLH](?=.*;)/
答案 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])/;
输出与原始代码的输出相同