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

时间:2017-12-18 15:12:34

标签: java regex

我正在读取一行的文件行,并且只想要这样的行:

gui_test=Hallo
gui_test_hello=Hello

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

我制作了这个正则表达式:

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

问题是,它适用于

gui_pfc_button_ok=Ok!

但不适合:

gui_pfcuser_opportunitydetails_label_title=label Title

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

3 个答案:

答案 0 :(得分: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]+)=(.*)$,但效率较低(使用比上述正则表达式更多的步骤)。

结果

输入

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

输出

  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
  5. 说明

    • ^在行首处断言位置
    • ([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测试。