gpt4 book ai didi

javascript - 根据分隔符从字符串中提取子字符串

转载 作者:行者123 更新时间:2023-11-29 21:02:17 26 4
gpt4 key购买 nike

我正在尝试从编码的二维条码中提取数据。提取部分工作正常,我可以在文本输入中获取值。

例如,解码后的字符串是

]d20105000456013482172012001000001/:210000000001

根据以下规则(无法获得正确的表格 Markdown ,因此附上图片),我试图从上述字符串中提取子字符串。

enter image description here

我要提取的子串:

05000456013482(在分隔符 01 之后)

201200(在分隔符 17 之后)

00001(在分隔符 10 之后)

0000000001(在分隔符 21 之后)

P.S -> 原始字符串 (]d2) 的前 3 个字符始终相同,因为它只是简单地表示解码方法。

现在有一些怪癖:

1) 分隔符10后的字母个数不固定。因此,在上面给出的示例中,即使它是 00001,它甚至可能是 001。同样,分隔符 21 之后的字母数也不固定,可以是不同的长度。

对于不同长度的分隔符,我添加了一个常量 /: 以确定在通过手持设备扫描后编码何时结束。

现在,我在分隔符 10 之后查找 /: 并提取字符串直到它命中 /: 或 EOL 并找到分隔符 21 并删除字符串直到它点击 /: 或 EOL

2) 分隔符 0117 之后的字母数总是固定的(分别为 14 个字母和 6 个字母),如表所示。

注意:分隔符的位置可能会改变。换句话说,编码后的条形码可以以不同的顺序书写。

]d20105000456013482172012001000001/:210000000001 - 注:无/: 在第 21 组之后签名,因为它是 EOL

]d2172012001000001/:210000000001/:0105000456013482 - 注:均为 10和 21 组有 /. 符号表示我们必须提取直到该符号

]d21000001/:210000000001/:010500045601348217201200 - 前两个是变长,后面两个是定长。

我不是正则表达式方面的专家,到目前为止我只尝试使用一些简单的模式,例如 (01)(\d*)(21)(\d*)(10)(\d*)(17 )(\d*)$ 在给定的示例中不起作用,因为它像前 2 个字符一样查找 10 个字符。此外,当我知道必须提取字符串的索引时,使用 substring(x, x) 方法仅适用于固定长度的字符串。

P.S - JS 和 jQuery 的帮助表示赞赏。

最佳答案

虽然您可以尝试制作一个非常复杂的正则表达式来执行此操作,但分步解析字符串会更具可读性和可维护性。

基本步骤是:

  1. 删除解码方法字符 (]d2)。
  2. 从第 1 步的结果中分离出前两个字符。
  3. 使用它来选择提取数据的方法
  4. 从字符串中删除并保存该数据,转到步骤 2 重复直到用尽字符串。

既然你有了一个 AI/数据结构表,你就可以使用多种方法来提取不同形式的数据

例如,由于 AI: 01, 11, 15, 17 都是定长的,你可以使用字符串的 slice 方法来获取长度

str.slice(0,14); //for 01
str.slice(0,6); //for 11 15 17

虽然像 AI 21 这样的变量会是这样的

var fnc1 = "/:";
var fnc1Index = str.indexOf(fnc1);
str.slice(0,fnc1Index);

演示

var dataNames = {
'01': 'GTIN',
'10': 'batchNumber',
'11': 'prodDate',
'15': 'bestDate',
'17': 'expireDate',
'21': '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 ]d2
str = str.slice(3);
while (str.length) {
//get the AI identifier: 01,10,11 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 "01":
data[dataName] = str.slice(0, 14);
str = str.slice(14);
break;
case "10":
case "21":
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 + 2);
}
break;
case "11":
case "15":
case "17":
data[dataName] = str.slice(0, 6);
str = str.slice(6);
break;
default:
console.log("unexpected ident encountered:",aiIndent);
return false;
break;
}
}
return data;
}
<input><button>Parse</button>

关于javascript - 根据分隔符从字符串中提取子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45918849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com