在字符类更改的位置拆分字符串

时间:2014-03-19 22:34:56

标签: javascript regex

我想知道是否有一种[简洁]的方式来分割字符串,其中字符的“类”(例如Unicode类别,甚至简单的字母/数字/空格)会从一个变为另一个。

例如,"18a.1.50".split(/\b/)之类的内容几乎可以正常运行,但会产生["18a", ".", "1", ".", "50"](“18a”被认为是单词),而不是["18", "a", ".", "1", ".", "50"]

我更喜欢JS兼容的正则表达式语法的解决方案,但我也对“正则表达式”感到好奇。

2 个答案:

答案 0 :(得分:4)

我不是一个正则表达式向导,所以可能有更好的方法,但这似乎与描述的一样。

"18a.1.50".match(/\.|\d+|[a-z]+/gi) //["18", "a", ".", "1", ".", "50"]

"18a..b12.1.50".match(/\.|\d+|[a-z]+/gi) // ["18", "a", ".", ".", "b", "12", ".", "1", ".", "50"]

答案 1 :(得分:1)

通过另一个问题Regex split numbers and letter groups without spaces,我发现了一个技巧,可以帮助解决问题的实际方面。基本上,在那里,而不是尝试在边界上拆分 ,只需匹配一类角色的整个 。对于字母和数字,它在JavaScript中看起来像"11E12C108N".match(/\d+|\D+/g) - 请注意.match()使用//g正则表达式而不是.split()

对于原始问题,"18a.1.50".match(/\d+|\w+|\W+/g)之类的东西可以解决这个问题,尽管不会在例如:{{1}}之间进行区分。标点符号与符号与控件与etc. etc.的对比。 更新:不,它没有,考虑像" a18.1.50"!如果所有类别都是互斥的,那么匹配才真正起作用,而大多数JavaScript的选项都不是这样。

总之,这稍微远一点,但仍然没有“规模化”#34;所有角色类都特别好,而不是每次都列出它们(并在最后的#34; X"匹配以后添加"非X"以防以后添加更多)。如果可以自己匹配边界(即拆分),我仍然很好奇。