在字符类改变的地方分割字符串



我想知道是否有一种[简洁的]方法来分割字符串,其中字符的"类"(例如Unicode类别,甚至简单地像字母/数字/空白)从一个到下一个变化。

例如,像"18a.1.50".split(/b/)这样的东西几乎可以工作,但产生["18a", ".", "1", ".", "50"]("18a"被认为是一个单词)而不是["18", "a", ".", "1", ".", "50"]

我更喜欢兼容js的正则表达式语法的解决方案,但我也对一般的"正则表达式"很好奇。

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

"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"]

通过另一个问题,Regex在没有空格的情况下分割数字和字母组,我发现了一个技巧,可以帮助解决这个问题的实际方面。基本上,在这里,不是试图在边界上分割,而是简单地匹配一整类字符的。对于字母和数字,它看起来像JavaScript中的"11E12C108N".match(/d+|D+/g) -注意使用.match()//g正则表达式而不是.split()

对于最初的问题,像"18a.1.50".match(/d+|w+|W+/g)这样的东西可以做到这一点,尽管不会区分例如标点符号、符号、控制、等等。UPDATE:不,它没有,考虑像"a18.1.50"这样的字符串!只有在所有类别都是互斥的情况下,匹配才能真正起作用,而大多数JavaScript选项都不是这样。

总而言之,如果不列出每个角色类别(并在最终的"X"匹配结束时添加"非X",以防稍后添加更多),这是有点深入的,但仍然不能"扩展"到所有角色类别。我也很好奇是否有可能匹配边界本身(即分裂)。

最新更新