我想知道是否有一种[简洁的]方法来分割字符串,其中字符的"类"(例如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",以防稍后添加更多),这是有点深入的,但仍然不能"扩展"到所有角色类别。我也很好奇是否有可能匹配边界本身(即分裂)。