我正在读取一行的文件行,并且只想要这样的行:
gui_test=Hallo
gui_test_hello=Hello
所以在左侧只有由_
分隔的小写字母。中间始终是=
,右侧可以是任意。
我制作了这个正则表达式:
^(([a-z]+_[a-z]+)+=.*)$
问题是,它适用于
gui_pfc_button_ok=Ok!
但不适合:
gui_pfcuser_opportunitydetails_label_title=label Title
我不知道我的问题在哪里。
答案 0 :(得分:3)
你面临的问题是正则表达式只捕获组中的最后一个匹配(至少在大多数引擎中; .net是一个例外)。您正在使用([a-z]+_[a-z]+)+
,虽然这是有效的,但您只匹配与此模式匹配的最后一个匹配项,因此,您只获得l_title
。由于比赛是贪婪的,你得到l_
,因为前一场比赛尽可能多地占用了比赛。打破这一点,你实际上是以下列方式进行匹配:
gui_pfcuse
r_opportunitydetail
s_labe
l_title
如果something_here_a_test
等下划线之间只有1个字母,那么您当前的正则表达式也会失败。查看正在使用的正则表达式here
^([a-z]+(?:_[a-z]+)*)=(.*)$
您也可以使用^((?:[a-z]+_)*[a-z]+)=(.*)$
,但效率较低(使用比上述正则表达式更多的步骤)。
gui_test=Hallo gui_test_hello=Hello
gui_pfcuser_opportunitydetails_label_title=label Title
gui_pfc_button_ok=Ok!
something_here_a_test=More words
gui_test=Hallo gui_test_hello=Hello
gui_test
Hallo gui_test_hello=Hello
gui_pfcuser_opportunitydetails_label_title=label Title
gui_pfcuser_opportunitydetails_label_title
label Title
gui_pfc_button_ok=Ok!
gui_pfc_button_ok
Ok!
something_here_a_test=More words
something_here_a_test
More words
^
在行首处断言位置([a-z]+(?:_[a-z]+)*)
将以下内容捕获到捕获组1中
[a-z]+
匹配任何小写ASCII字母一次或多次(?:_[a-z]+)*
符合以下任意次数。如果您需要至少一个匹配,则可以将*
更改为+
,以便最终得到(?:_[a-z]+)+
_
按字面意思匹配[a-z]+
匹配任何小写ASCII字母一次或多次=
按字面意思匹配(.*)
将任何字符(换行符除外)捕获到捕获组2 $
断言行尾的位置答案 1 :(得分:2)
^(([a-z]+_)+[a-z]+\=.*) $
在https://regex101.com/上测试了各个部分:
^ Asserts position at start of a line
([a-z]+_)+ One or more sequences of the form <one_or_more_lower_case>_
[a-z]+ One or more lower case letter
\= escaped equals sign
.* zero or more characters
$ end of line
答案 2 :(得分:2)
只需将下划线移动到字符类括号中,就可以了。如果你想要,也可以删除内部组的+ ...
^(([a-z]+[_a-z]+)=.*)$
如果您愿意,可以在regex101.com尝试。
如果您不想匹配具有两个连续下划线的线条,则可以在伪代码xxx(_xxx)*
中对下划线部分进行分组,然后将变为
^([a-z]+(_[a-z]+)*+=.*)$
也可在regex101.com测试。