我有这样的字符串:
ab
rx'
wq''
pok'''
oyu,
mi,,,,
基本上,我想将字符串分成两部分。第一部分应该是字母字符完整,第二部分应该是非字母字符。
字母部分保证在a和z之间是2-3个小写字符;非字母部分可以是任意长度,并且仅被保证为字符,
或'
,但不是两个字符串中都有(例如,eex,',
将永远不会发生)。< / p>
所以结果应该是:
[ab][]
[rx][']
[wq]['']
[pok][''']
[oyu][,]
[mi][,,,,]
我该怎么做?我猜一个正则表达式,但我并不擅长提出它们。
答案 0 :(得分:2)
如果你可以100%保证:
您可以使用:
/^([a-zA-Z]{2,3})('+|,+)$/gm
var arr = /^([a-zA-Z]{2,3})('+|,+)$/gm.exec("pok'''");
arr === ["pok'''", "pok", "'''"];
var arr = /^([a-zA-Z]{2,3})('+|,+)$/gm.exec("baf,,,");
arr === ["baf,,,", "baf", ",,,"];
当然,请保存一些理智,并将RegEx保存为var。
作为警告,如果您没有像这样处理RegEx:
如果找不到匹配项 - 如果您尝试通过混合标记匹配foo',''
,或者您有0-1或4+个字母或0标记...... ...而不是返回一个数组,你会得到null
。
所以你可以这样做:
var reg = /^([a-zA-Z]{2,3})('+|,+)$/gm,
string = "foobar'',,''",
result_array = reg.exec(string) || [string];
在这种情况下,exec的结果为null;通过放置|| (或)在那里,我们可以返回一个包含原始字符串的数组,作为index-0。
为什么?
因为成功执行exec的结果将有3个插槽; [*string*, *letters*, *marks*]
。
你可能只想阅读像result_array[1]
这样的字母。
但如果匹配失败并且result_array === null
,则JavaScript会因您尝试null[1]
而尖叫。
因此,在失败的exec结束时返回数组将允许你获得result_array[1] === undefined
(即:模式没有匹配,因此index-1中没有字母),而不是JS错误。
答案 1 :(得分:2)
正则表达式有一个很好的特殊称为“单词边界”(\b
)。您可以使用它来检测单词的边界,这是一个字母数字字符序列。
所以你要做的就是
foo.split(/\b/)
例如,
"pok'''".split(/\b/) // ["pok", "'''"]
答案 2 :(得分:0)
你可以尝试类似的东西:
function splitString(string){
var match1 = null;
var match2 = null;
var stringArray = new Array();
match1 = string.indexOf(',');
match2 = string.indexOf('`');
if(match1 != 0){
stringArray = [string.slice(0,match1-1),string.slice(match1,string.length-1];
}
else if(match2 != 0){
stringArray = [string.slice(0,match2-1),string.slice(match2,string.length-1];
}
else{
stringArray = [string];
}
}
答案 3 :(得分:0)
var str = "mi,,,,";
var idx = str.search(/\W/);
if(idx) {
var list = [str.slice(0, idx), str.slice(idx)]
}
您将拥有list[0]
和list[1]
中的部分。
P.S。可能有一些比这更好的方法。
答案 4 :(得分:0)
yourStr.match(/(\ W {2,3})([,'] *)/)
答案 5 :(得分:0)
if (match = string.match(/^([a-z]{2,3})(,+?$|'+?$)/)) {
match = match.slice(1);
}