0

我有这样的字符串:

ab
rx'
wq''
pok'''
oyu,
mi,,,,

基本上,我想将字符串分成两部分。第一部分应该有完整的字母字符,第二部分应该有非字母字符。字母部分保证a和z之间为2-3个小写字符;非字母部分可以是任意长度,并且保证只能是字符,',但不能同时出现在一个字符串中(例如eex,',,永远不会出现)。

所以结果应该是:

[ab][]
[rx][']
[wq]['']
[pok][''']
[oyu][,]
[mi][,,,,]

我怎样才能做到这一点?我猜是一个正则表达式,但我不是特别擅长想出它们。

4

6 回答 6

2

如果您可以 100% 保证:

  1. 字母字符串为 2 或 3 个字符
  2. 总是有一个或多个素数/逗号
  3. 在字母和标记之前、之后或中间没有任何空格
    (除了换行符)

您可以使用:

/^([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。

作为警告,如果您没有像这样处理过正则表达式:如果未找到匹配项 - 如果您尝试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。

为什么?

因为成功执行的结果将有 3 个插槽;[*string*, *letters*, *marks*]. 您可能很想只阅读像result_array[1]. 但是如果匹配失败result_array === null,那么 JavaScript 会因为你的尝试而尖叫null[1]

因此,在失败的 exec 末尾返回数组将允许您获取result_array[1] === undefined(即:与模式不匹配,因此 index-1 中没有字母),而不是 JS 错误。

于 2012-08-10T06:52:49.250 回答
2

正则表达式有一个很好的特殊名称,称为“单词边界”(\b)。您可以使用它来检测单词的边界,这是一个字母数字字符序列。

所以你所要做的就是

foo.split(/\b/)

例如,

"pok'''".split(/\b/) // ["pok", "'''"]
于 2012-08-10T07:23:44.513 回答
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];
   }

}

于 2012-08-10T06:44:41.083 回答
0
var str = "mi,,,,";
var idx = str.search(/\W/);
if(idx) {
    var list = [str.slice(0, idx), str.slice(idx)]
}

您将拥有list[0]和中的零件list[1]

PS可能有比这更好的方法。

于 2012-08-10T06:47:08.483 回答
0

yourStr.match(/(\w{2,3})([,']*)/)

于 2012-08-10T06:47:37.547 回答
0
if (match = string.match(/^([a-z]{2,3})(,+?$|'+?$)/)) {
    match = match.slice(1);
}
于 2012-08-10T07:08:03.290 回答