即时通讯读取行的文件行,只需要像以下行:
gui_test=Hallo
gui_test_hello=Hello
所以在左侧只有由_
分隔的小写字母。在中间总是=
,在右边可以是任何。
我做了这个正则表达式:
^(([a-z]+_[a-z]+)+=.*)$
问题是,它正在努力
gui_pfc_button_ok=Ok!
但不适用于:
gui_pfcuser_opportunitydetails_label_title=label Title
我不知道我的问题在哪里。
你面临的问题是正则表达式只捕获组中的最后一个匹配(至少在大多数引擎中; .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
第1组:gui_test
第2组:Hallo gui_test_hello=Hello
gui_pfcuser_opportunitydetails_label_title=label Title
第1组:gui_pfcuser_opportunitydetails_label_title
第2组:label Title
gui_pfc_button_ok=Ok!
第1组:gui_pfc_button_ok
第2组:Ok!
something_here_a_test=More words
第1组:something_here_a_test
第2组:More words
^
在线的开头断言位置([a-z]+(?:_[a-z]+)*)
将以下内容捕获到捕获组1中
[a-z]+
匹配任何小写ASCII字母一次或多次
(?:_[a-z]+)*
匹配以下任意次数。如果你需要至少一个匹配,你可以将*
更改为+
,这样你最终会得到(?:_[a-z]+)+
_
按字面意思对比
[a-z]+
匹配任何小写ASCII字母一次或多次=
按字面意思对比(.*)
将任何字符(换行符除外)捕获到捕获组2中$
在线的末尾断言位置只需将下划线移动到字符类括号中,就可以回家了。你也可以删除内部组的+ ...
^(([a-z]+[_a-z]+)=.*)$
如果你愿意,你可以在regex101.com试试。
如果您不想匹配具有两个连续下划线的线,则可以在伪代码xxx(_xxx)*
中对下划线部分进行分组,然后这将成为
^([a-z]+(_[a-z]+)*+=.*)$
也可以在regex101.com测试。
^(([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