【发布时间】:2017-08-30 08:51:12
【问题描述】:
这是一个基于我之前提出的问题Extracting substring from string based on delimiter(已接受答案)的新问题
我有一个字符串]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765}
注意:上例中}后面有个空格
我在上述字符串上的分隔符是 9N、1T、D、S,我需要提取分隔符之后的子字符串,直到它达到~ 或 EOL。
在下面的小提琴中,它期望 D1 和 S1 作为分隔符,而不是分别使用 D 和 S。
我面临 2 个问题
1) 单字符分隔符问题(D、S)
2) 返回值时,我应该如何在字符串末尾去掉}。例如,带有分隔符S 的子字符串应该返回12345ABCDEF98765 而不是12345ABCDEF98765}
Fiddle(结果基于控制台)
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;
}
【问题讨论】:
标签: javascript string substring