这是一个新问题,基于我之前提出的问题根据分隔符从字符串中提取子字符串(已接受答案)
我有一个字符串 ]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765}
注意:}
上面的例子后面有一个空格
我在上述字符串上的分隔符是 9N、1T、D、S,我需要在分隔符之后提取子字符串,直到它命中~
或 EOL。
在它下面的小提琴期待D1
并S1
作为分隔符,而不是D
和S
分别。
我面临两个问题
1) 单字符分隔符问题 ( D
, S
)
2)}
返回值时我应该如何在字符串的末尾剥离。例如,带分隔符的子字符串S
应该返回12345ABCDEF98765
而不是12345ABCDEF98765}
小提琴(结果基于控制台)
JS
// Use ]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765}
// Note: There is an empty space after the } char as shown above
var dataNames = {
'9N': 'PPN',
'1T': 'batchNumber',
'D': 'expireDate',
'S': 'serialNumber'
};
var input = document.querySelector("input");
document.querySelector("button").addEventListener("click", function() {
var str = input.value;
console.log(parseGS1(str));
});
function parseGS1(str) {
var fnc1 = "~";
var data = {};
//remove ]d1[)½}06~
str = str.slice(10);
while (str.length) {
//get the AI identifier: 1T, 9N etc
let aiIdent = str.slice(0, 2);
//get the name we want to use for the data object
let dataName = dataNames[aiIdent];
//update the string
str = str.slice(2);
switch (aiIdent) {
case "1T":
case "9N":
let fnc1Index = str.indexOf(fnc1);
//eol or fnc1 cases
if (fnc1Index == -1) {
data[dataName] = str.slice(0);
str = "";
} else {
data[dataName] = str.slice(0, fnc1Index);
str = str.slice(fnc1Index + 1);
}
break;
case "D":
case "S":
//eol or fnc1 cases
break;
default:
console.log("unexpected ident encountered:", aiIdent);
return false;
break;
}
}
return data;
}
您也可以使用正则表达式执行此操作。使用此解决方案,当部分字符串四处移动时,它仍然可以工作。
function getData(input) {
input = input.slice(0, input.length - 2);
// The regex has two capture groups.
// Group 1 gets the identifier, this can also be the start of the string.
// Group 2 gets all the characters between the identifier and the '~' char or '} '.
// The third group is a non-capturing group, it is used to find the delimiter where the next part starts.
var
regex = /(^|9N|1T|D|S)(.*?)(?:~|$)/g,
data = {},
match = regex.exec(input);
while (match !== null) {
switch(match[1]) {
case '9N':
data.PPN = match[2];
break;
case '1T':
data.batch = match[2];
break;
case 'D':
data.expireDate = match[2];
break;
case 'S':
data.serial = match[2];
break;
}
var msg = 'Found ' + match[0] + ' / identifier = ' + match[1] + ' / value = ' + match[2] + '. ';
console.log(msg);
// Get the next match.
match = regex.exec(input);
}
return data;
}
var input = ']d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765} ',
input2 = ']d1[)½}06~9N110375286414~D150600~1T12345ABCD~S12345ABCDEF98765} ';
console.log(getData(input));
console.log(getData(input2));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句