Javascript:为每个用分号分隔的子字符串获取第一个数字子字符串

时间:2019-02-13 09:35:38

标签: javascript string for-loop

我正在从MySQL创建时间计算脚本,因为我不想在PHP的服务器端加载脚本。

我正在获取数据并使用JSON对其进行解析,这给了我一列列和行数据的值。该数据的格式如下:

  

1548145153,1548145165,结束,天; 1548145209,1548145215,结束,天; 1548148072,1548148086,结束,天; 1548161279,1548161294,结束,天; 1548145161,1548145163,结束,天; 1548148082,1548148083,结束,天; 1548161291,1548161293,End,Day

我需要用分号分隔此字符串,然后从每个逗号之前提取第一个VARCHAR号,以便在后续计算中使用它。

例如,我想从上面的数据中提取以下内容:

[1548145153, 1548145209, 1548148072, 1548161279, 1548145161, 1548148082, 1548161291]

我使用了以下类型的for循环,但无法正常运行:

for (var i=0; i < words.length; i++) {
           var1 = words[i];
           console.log(var1);
}

字符串和for循环在一起,如下所示:

var processData = function(data) {
for(var a = 0; a < data.length; a++) {

     var obj = data[a];
     var str= obj.report // something like 1548145153,1548145165,End,Day;1548145209,1548145215,End,Day;1548148072,1548148086,End,Day;1548161279,1548161294,End,Day;1548145161,1548145163,End,Day;1548148082,1548148083,End,Day;1548161291,1548161293,End,Day
     words = str.split(',');
     words = str.split(';');
     for (var i=0; i < words.length; i++) {
           var1 = words[i];
           var2 = var1[0];
           console.log(var2);
}

3 个答案:

答案 0 :(得分:1)

第一件事是,您用words的内容覆盖了str.split(';'),因此它不会满足您的期望。要将字符串拆分为多个块,请先用;拆分,然后遍历结果数组,并在循环内迭代用,拆分。

const str= "1548145153,1548145165,End,Day;1548145209,1548145215,End,Day;1548148072,1548148086,End,Day;1548161279,1548161294,End,Day;1548145161,1548145163,End,Day;1548148082,1548148083,End,Day;1548161291,1548161293,End,Day";

const lines = str.split(';');

lines.forEach(line => {
  const parts = line.split(',');
  console.log(parts[0]);
});

答案 1 :(得分:1)

这是一种基于正则表达式的方法:

const str = "1548145153,1548145165,End,Day;1548145209,1548145215,End,Day;1548148072,1548148086,End,Day;1548161279,1548161294,End,Day;1548145161,1548145163,End,Day;1548148082,1548148083,End,Day;1548161291,1548161293,End,Day";

const ids = str.match(/(?<=;)(\d+)|(^\d+(?=,))/gi)

console.log(ids)

这里的总体思路是将第一个VARCHAR值归类为:

  • 直接在;字符之后的数字序列(请参见下面的1),或者对于小写字母
  • 输入字符串的第一个数字序列,后跟一个,字符(请参阅下面的2)。

这两种情况表示如下:

  1. 使用negated lookbehind rule;匹配以(?<=;)(\d+)开头的任何数字序列,其中;是必须跟随数字序列{{1}的字符}成为比赛对象
  2. 匹配任何数字序列,该数字序列是输入字符串的第一个数字序列,并使用lookahead rule \d+(紧随其后的是,,其后紧跟(^\d+(?=,))数字序列,\d+是必须直接跟随该数字序列才能匹配的字符
  3. 使用,运算符将这些构件1和2组合在一起,以获得最终结果

答案 2 :(得分:0)

您所做的不正确,因为有两个分隔符,所以必须将字符串分开两次。即逗号和分号。

我认为您需要一个嵌套循环。

var str = "1548145153,1548145165,End,Day;1548145209,1548145215,End,Day;1548148072,1548148086,End,Day;1548161279,1548161294,End,Day;1548145161,1548145163,End,Day;1548148082,1548148083,End,Day;1548161291,1548161293,End,Day"
let words = str.split(';');
for (var i=0; i < words.length; i++) {
    let varChars = words[i].split(',');
    for (var j=0; j < varChars.length; i++)
        console.log(varChars[j]);
}

我希望这会有所帮助。请不要忘记标记答案。