基于Pattern将字符串分解为块

时间:2010-12-03 02:22:36

标签: javascript regex

我有一个字符串,如下所示:

a[abcdefghi,2,3,jklmnopqr]

开头“a”是固定且不变的,但括号内的内容是并且可以遵循模式。它将始终是一个按字母顺序排列的字符串,可能后面跟着逗号或更多字符串和/或数字分隔的数字。

我希望能够将其分解为字符串的块以及跟随它的任何数字,直到满足“]”或其他字符串。

可能最好通过示例和预期的理想结果进行解释:

a[abcdefghi]               -> "abcdefghi"
a[abcdefghi,2]             -> "abcdefghi,2"
a[abcdefghi,2,3,jklmnopqr] -> "abcdefghi,2,3" and "jklmnopqr"
a[abcdefghi,2,3,jklmnopqr,stuvwxyz]     -> "abcdefghi,2,3" and "jklmnopqr" and "stuvwxyz"
a[abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz] -> "abcdefghi,2,3" and "jklmnopqr,1,9" and "stuvwxyz"
a[abcdefghi,1,jklmnopqr,2,stuvwxyz,3,4] -> "abcdefghi,1" and "jklmnopqr,2" and "stuvwxyz,3,4"

理想情况下,一个格式错误的字符串会被部分捕获(但这是一个很好的额外):

a[2,3,jklmnopqr,1,9,stuvwxyz] -> "jklmnopqr,1,9" and "stuvwxyz"

我正在使用Javascript,我意识到正则表达式不会让我一直到我想要的解决方案,但它可能是一个很大的帮助。另一种方法是做很多手动字符串解析,我可以这样做,但似乎不是最好的答案。

建议,提示赞赏。

更新:是的我确实是指alphametcial(A-Za-z)而不是字母数字。编辑以反映这一点。谢谢你告诉我。

3 个答案:

答案 0 :(得分:2)

您可能希望分两步完成此操作。首先,匹配:

a\[([^[\]]*)\]

并提取组1.这将是方括号中的内容。

接下来,反复匹配:

[a-z]+(,[0-9]+)*

那就像“abcdefghi,2,3”这样的东西。在第一场比赛之后,您需要查看下一个字符是否为逗号,如果是,则跳过它。 (顺便说一句:如果您的确意味着字母数字而不是字母,请使用[a-z0-9]*[a-z][a-z0-9]*代替[a-z]+。)

或者,将字符串拆分为逗号并重新组合成带有数字组的单词。

答案 1 :(得分:1)

为什么正则表达式不能为您提供解决方案? 以下正则表达式对付给定的数据,但它做了一些假设(至少两个alphas后跟逗号分隔的单个数字)。

([a-z]{2,}(?:,\\d)*)

示例:

re = new RegExp('[a-z]{2,}(?:,\\d)*', 'g') 
matches = re.exec("a[abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz]")

答案 2 :(得分:0)

假设您可以轻松地突破括号之间的字符串,这样的内容可能就是您所追求的:

> re = new RegExp('[a-z]+(?:,\\d)*(?:,?)', 'gi')
> while (match = re.exec("abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz")) { print(match[0]) }
abcdefghi,2,3,
jklmnopqr,1,9,
stuvwxyz

这样做的好处是可以部分处理错误的案例:

> while (match = re.exec("abcdefghi,2,3,jklmnopqr,1,9,stuvwxyz")) { print(match[0]) }
jklmnopqr,1,9,
stuvwxy

如果您认为第一个字符类[a-z]是真正的字母数字,则可以对其进行修改。