以下是PHP,但正则表达式也将在javascript中使用。
尝试从字符串中提取重复模式
string可以是以下任何一种:
"something arbitrary"
"D123"
"D111|something"
"D197|what.org|when.net"
"D297|who.197d234.whatever|when.net|some other arbitrary string"
我目前正在使用以下正则表达式:/^D([0-9]{3})(?:\|([^\|]+))*/
这正确地与第一个字符串不匹配,正确匹配第二个和第三个字符串。问题是第三和第四只匹配Dxxx和最后一个字符串。我需要' |'之间的每个字符串。匹配。
我希望使用正则表达式,因为它只需一步。我意识到我可以检测到领先的Dxxx,然后使用爆炸或拆分,以打破字符串。我只是因为想要一个正则表达式匹配步骤而陷入困境。
同样的正则表达式也可以在Python中使用,所以只需要一个通用的正则表达式解决方案。
答案 0 :(得分:0)
在正则表达式中无法获得动态数量的捕获组,但如果您知道在一个字符串中有多少部分的上限,则可以多次重复该模式:
/^D([0-9]{3})(?:$|\|)(.*?)(?:$|\|)(.*?)(?:$|\|)(.*?)(?:$|\|)(.*?)(?:$|\|)/
因此,在初始^D([0-9]{3})(?:$|\|)
之后,您只需根据需要重复(.*?)(?:$|\|)
次。
当字符串中的元素较少时,剩余的捕获组将匹配空字符串。
请参阅regex tester。
答案 1 :(得分:0)
类似preg_match_all()
(全局匹配的PHP变体)也可以接受吗?
然后你可以使用:
^(?|D([0-9]{3})|^.+$|(?!^)\|([^|\n]*)(?=\||$))
这将匹配不同匹配项中字符串中的所有内容,例如拿你的字符串:
D197|what.org|when.net
然后你会给三场比赛:
D197
what.org
when.net
正在直播:https://regex101.com/r/jL2oX6/4(绿色中的所有内容都是群组匹配。忽略蓝色内容。)