如何在 JavaScript 中拆分此字符串

How can I split this string in JavaScript?

本文关键字:拆分 字符串 JavaScript      更新时间:2023-09-26

我有这样的字符串:

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

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

所以结果应该是:

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

我该怎么做?我猜的是正则表达式,但我不是特别擅长想出它们。

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

所以你所要做的就是

foo.split(/'b/)

例如

"pok'''".split(/'b/) // ["pok", "'''"]

如果你能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", ",,,"];

当然,为自己节省一些理智,并将该正则表达式保存为变量。

作为警告,如果您还没有像这样处理正则表达式:如果找不到匹配项 - 如果您尝试通过混合标记来匹配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错误。

你可以尝试这样的事情:

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];
   }

}

var str = "mi,,,,";
var idx = str.search(/'W/);
if(idx) {
    var list = [str.slice(0, idx), str.slice(idx)]
}

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

附言可能有一些比这更好的方法。

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

if (match = string.match(/^([a-z]{2,3})(,+?$|'+?$)/)) {
    match = match.slice(1);
}