我正在从 MySQL 创建时间计算脚本,因为我不想使用 PHP 在服务器端加载脚本。
我正在获取数据并使用 JSON 对其进行解析,这为我提供了列和行数据的值字符串。此数据的格式如下:
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
我需要用分号分割这个字符串,然后从每个逗号之前提取第一个 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);
}
最佳答案
这是一种基于正则表达式的方法:
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)。
这两种情况表示如下:
- 匹配任何以
;
开头的数字序列使用 negated lookbehind rule :(?<=;)(\d+)
, 其中;
是必须跟在数字序列\d+
之后的字符成为一场比赛 - 匹配作为输入字符串第一个数字序列且具有
,
的任何数字序列使用 lookahead rule 直接跟随它(^\d+(?=,))
, 其中\d+
是数字序列,,
是必须直接跟随该数字序列才能匹配的字符 - 这些构建 block 1 和 2 使用
|
组合在一起运算符实现最终结果
关于Javascript:为每个分号分隔的子字符串获取第一个数字子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54666797/