试图从php / javascript中的字符串中提取重复模式

时间:2016-07-27 22:52:41

标签: regex

以下是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中使用,所以只需要一个通用的正则表达式解决方案。

2 个答案:

答案 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(绿色中的所有内容都是群组匹配。忽略蓝色内容。)