Javascript 大写和第一个数字上的正则表达式拆分

Javascript 大写和第一个数字上的正则表达式拆分,javascript,regex,Javascript,Regex,我需要将字符串“thisIs12MyString”拆分为一个数组,看起来像[“this”、“Is”、“12”、“My”、“string”] 我已经得到了“thisIs12MyString”。split(/(?=[A-Z0-9])/)但它在每个数字上拆分,并给出数组[“this”,“Is”,“1”,“2”,“My”,“String”] 因此,换句话说,我需要将大写字母上的字符串和前面没有另一个数字的数字分开。我想不出用正则表达式实现这一点的任何方法 我想你需要用代码来做 请检查URL,同一问题不同

我需要将字符串
“thisIs12MyString”
拆分为一个数组,看起来像
[“this”、“Is”、“12”、“My”、“string”]

我已经得到了
“thisIs12MyString”。split(/(?=[A-Z0-9])/)
但它在每个数字上拆分,并给出数组
[“this”,“Is”,“1”,“2”,“My”,“String”]


因此,换句话说,我需要将大写字母上的字符串和前面没有另一个数字的数字分开。

我想不出用正则表达式实现这一点的任何方法

我想你需要用代码来做

请检查URL,同一问题不同语言(ruby)->

代码位于底部:

正如我在评论中所说,我的方法是首先在每个数字序列之前插入一个特殊字符作为标记:

其中,
~
可以是任何其他字符,最好是不可打印的字符(例如控制字符),因为它不太可能在字符串中“自然”出现

在这种情况下,您甚至可以在每个大写字母之前插入标记,并省略前面的部分,从而使拆分非常容易:

"thisIs12MyString".replace(/\d+|[A-Z]/g, '~$&').split('~')

它的性能可能会更好,也可能不会更好。

您可以使用当前的正则表达式修复处理数组拆分的lookbehinds的JS缺失
快速伪代码:

var result = [];
var digitsFlag = false;
"thisIs12MyString".split(/(?=[A-Z0-9])/).forEach(function(word) {

    if (isSingleDigit(word)) {
        if (!digitsFlag) {
            result.push(word);
        } else {
            result[result.length - 1] += word;
        }
        digitsFlag = true;
    } else {
        result.push(word);
        digitsFlag = false;
    }

});
在我的rhino控制台中

js> "thisIs12MyString".replace(/([A-Z]|\d+)/g, function(x){return " "+x;}).split(/ /);
this,Is,12,My,String
另一个,

js> "thisIs12MyString".split(/(?:([A-Z]+[a-z]+))/g).filter(function(a){return  a;});
this,Is,12,My,String

你在找这个吗

"thisIs12MyString".match(/[A-Z]?[a-z]+|[0-9]+/g)
返回

["this", "Is", "12", "My", "String"]

@Jesper哦,这实际上相当棘手,因为javascript不处理lookbehind。用一个正则表达式完成这项工作很重要吗?为什么不把它分成两部分呢?它可能会增加可读性。我不认为你可以用一个前瞻或甚至一个表达式来做这件事(也就是说,我不认为自己是正则表达式专家)。一个办法是在每个数字序列前插入一个特殊字符,并用这个字符分割。@MikulasDite谢谢你的尝试,我觉得这个并不容易。可能更容易改变我的命名约定。在一个正则表达式中也很不清楚:为什么1和2应该组合在一起,而不是1、2和M?如果一个以上的大写字母与另一个相邻,会发生什么情况?也许两次分裂是最好的选择。+1目前为止最好的答案。我不明白我怎么会忘记匹配!!你没有被OP关注于拆分字符串的事实所影响+1 :)
["this", "Is", "12", "My", "String"]