我有一个字符串,其中包含5个由下划线分隔的数据:
AAA_BBB_CCC_DDD_EEE
我想为每个组件使用不同的正则表达式。 正则表达式只需要返回一个组件。 例如,第一个只返回AAA,第二个返回BBB等等。
我可以使用以下内容解析AAA:
^([^_]*)?
我看到我可以像这样环顾四周找到:
(?<=[^_]*_).*
BBB_CCC_DDD_EEE
但以下找不到BBB
(?<=[^_]*_)[^_]*(?=_)
答案 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和下划线或新行一次或多次,并重复该模式零次或多次以获得完全匹配$
断言行尾的位置