带有低位字母的Java Regex左下角,中间位置和右侧任意位置

问题描述 投票:0回答:3

即时通讯读取行的文件行,只需要像以下行:

gui_test=Hallo
gui_test_hello=Hello

所以在左侧只有由_分隔的小写字母。在中间总是=,在右边可以是任何。

我做了这个正则表达式:

^(([a-z]+_[a-z]+)+=.*)$

问题是,它正在努力

gui_pfc_button_ok=Ok!

但不适用于:

gui_pfcuser_opportunitydetails_label_title=label Title

我不知道我的问题在哪里。

java regex
3个回答
3
投票

简要

你面临的问题是正则表达式只捕获组中的最后一个匹配(至少在大多数引擎中; .net是一个例外)。您正在使用([a-z]+_[a-z]+)+,虽然这是有效的,但您只匹配与此模式匹配的最后一个匹配项,因此,您只获得l_title。由于比赛是贪婪的,你得到l_,因为前一场比赛尽可能多的角色。打破这一点你实际上是以下列方式匹配:

  • gui_pfcuse
  • r_opportunitydetail
  • s_labe
  • l_title

如果something_here_a_test之类的下划线之间只有1个字母,那么您当前的正则表达式也会失败。在使用here时查看你的正则表达式


See regex in use here

^([a-z]+(?:_[a-z]+)*)=(.*)$

您也可以使用^((?:[a-z]+_)*[a-z]+)=(.*)$但效率较低(使用比上面的正则表达式更多的步骤)。


结果

Input

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

Output

  1. 比赛:gui_test=Hallo gui_test_hello=Hello 第1组:gui_test 第2组:Hallo gui_test_hello=Hello
  2. 比赛:gui_pfcuser_opportunitydetails_label_title=label Title 第1组:gui_pfcuser_opportunitydetails_label_title 第2组:label Title
  3. 比赛:gui_pfc_button_ok=Ok! 第1组:gui_pfc_button_ok 第2组:Ok!
  4. 比赛: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中
  • $在线的末尾断言位置

2
投票

只需将下划线移动到字符类括号中,就可以回家了。你也可以删除内部组的+ ...

^(([a-z]+[_a-z]+)=.*)$

如果你愿意,你可以在regex101.com试试。

如果您不想匹配具有两个连续下划线的线,则可以在伪代码xxx(_xxx)*中对下划线部分进行分组,然后这将成为

^([a-z]+(_[a-z]+)*+=.*)$

也可以在regex101.com测试。


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
© www.soinside.com 2019 - 2024. All rights reserved.