下划线分隔字符串

时间:2018-04-11 21:46:56

标签: java regex

我有一个字符串,其中包含5个由下划线分隔的数据:

AAA_BBB_CCC_DDD_EEE

我想为每个组件使用不同的正则表达式。 正则表达式只需要返回一个组件。 例如,第一个只返回AAA,第二个返回BBB等等。

我可以使用以下内容解析AAA:

^([^_]*)?

我看到我可以像这样环顾四周找到:

(?<=[^_]*_).*
BBB_CCC_DDD_EEE

但以下找不到BBB

(?<=[^_]*_)[^_]*(?=_)

2 个答案:

答案 0 :(得分:0)

混合lookbehind和lookahead

^([^_]+)? // 1st
(?<=_)[^_]+ // 2nd
(?<=_)[^_]+(?=_[^_]+_[^_]+$) // 3rd
(?<=_)[^_]+(?=_[^_]+$) // 4th
[^_]+$ // 5th

只要字符串的长度在&#34; _&#34;之间。众所周知它可以像这样

第一场比赛

^([^_]+)?

第二场比赛

(?<=_)\K[^_]+

第三场比赛

(?<=_[A-Za-z]{3}_)\K[^_]+
第四场比赛

(?<=_[A-Za-z]{3}_[A-Za-z]{3}_)\K[^_]+

第5场比赛

(?<=_[A-Za-z]{3}_[A-Za-z]{3}_[A-Za-z]{3}_)\K[^_]+

每个{3}表示字符串beetween&#34; _&#34;

的长度

<击>

答案 1 :(得分:0)

如果您的字符串始终使用下划线,您可以使用1个正则表达式来捕获捕获组中的值,方法是使用量词来重复前面的模式(在这种情况下,不是下划线后跟下划线)改变如{3}

通过这种方式,您可以使用量词指定您想要重复模式的次数,然后捕获您的匹配。对于示例字符串AAA_BBB_CCC_DDD_EEE,您可以使用{0}{1}{2}{3}{4}

^(?:[^_\n]+_){3}([0-9A-Za-z]+)(?:_[^_\n]+)*$

那将匹配:

  • ^在行首处断言位置
  • (?:[^_\n]+_){3}在非捕获组(?:中,匹配NOT和下划线或新行一次或多次[^_\n]+后跟下划线并重复n次(在此示例中为n是3次)
  • ([0-9A-Za-z]+)使用例如character class(或使用[^_]+匹配不是下划线但也匹配任何空白字符)来捕获组中的角色。
  • (?:_[^_\n]+)*在捕获的值之后,在非捕获组中重复匹配下划线,NOT和下划线或新行一次或多次,并重复该模式零次或多次以获得完全匹配
  • $断言行尾的位置