使用javascript基于一位数或两位数字符提取子字符串

使用javascript基于一位数或两位数字符提取子字符串,javascript,string,substring,Javascript,String,Substring,这是一个基于我之前提出的问题的新问题(答案已接受) 我有一个字符串]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765} 注意:在上述示例中,}后面有一个空格 上面字符串上的分隔符是9N、1T、D、S,我需要提取分隔符后面的子字符串,直到它到达~或EOL 在下面的小提琴中,它期望将D1和S1分别作为分隔符,而不是D和S 我面临两个问题 1) 单字符分隔符问题(D,S) 2) 返回值时,我应该如何去掉字符串末尾的。例如,带有分

这是一个基于我之前提出的问题的新问题(答案已接受)

我有一个字符串
]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765}

注意:在上述示例中,
}
后面有一个空格

上面字符串上的分隔符是9N、1T、D、S,我需要提取分隔符后面的子字符串,直到它到达
~
或EOL

在下面的小提琴中,它期望将
D1
S1
分别作为分隔符,而不是
D
S

我面临两个问题

1) 单字符分隔符问题(
D
S

2) 返回值时,我应该如何去掉字符串末尾的
。例如,带有分隔符
S
的子字符串应该返回
12345ABCDEF98765
,而不是
12345ABCDEF98765}

(结果基于控制台)

JS


如果字符串始终采用问题中显示的格式,则可以在~符号处拆分字符串,然后只检查子字符串的前2个字符

var string = "]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765} "

var substrings = string.split('~');
substrings.shift(); //get rid of irrelevant first array element
substrings[substrings.length-1] = substrings[substrings.length-1].replace("} ", "");
上面exmaple中的替换消除了结尾处的大括号。但我不完全确定这是否是最优雅的方式。它肯定不是最灵活的,因此如果你面对的不是结尾处的大括号+空格,它当然不会被删除


在提取这些子字符串并去掉第一个数组元素后,您可以只检查字符串中的第一个字符。

在您的示例中,
~
位于子字符串的末尾,也位于分隔符的开头

因此,您可以使用
~
作为分隔符本身的一部分,并在正则表达式中使用
~9N
~1T
等来拆分字符串。这解决了单字符分隔符的问题,如
D
S
现在变成
~D
~S

第二个问题通过匹配正则表达式中的
}
来解决,并通过不将其捕获为
~S
后面的子字符串的一部分而将其从输出中删除

示例代码:

//您的输入
var str=']d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765}';
//用于解析分隔符的正则表达式
var模式=/(.*)~9N(.*)~1T(.*)~D(.*)~S(.*)\}/;
//分隔符说明
变量数据名={
‘9N’:‘PPN’,
'1T':'batchNumber',
“D”:“过期日期”,
'S':'serialNumber'
};
//测试输入
console.log(parseGS1(str));
//解析函数
函数parseGS1(str){
//调用正则表达式
var match=pattern.exec(str);//尝试console.log(match);
//输出对象
变量数据={};
//匹配项2-5应为子字符串
数据[dataNames['9N']]=匹配[2];
数据[dataNames['1T']]=匹配[3];
数据[dataNames['D']]=匹配[4];
数据[dataNames['S']]=匹配[5];
返回数据;

}
您也可以使用正则表达式执行此操作。使用此解决方案,当字符串的某些部分被移动时,它仍然可以工作

函数getData(输入){ input=input.slice(0,input.length-2); //正则表达式有两个捕获组。 //组1获取标识符,这也可以是字符串的开头。 //组2获取标识符和“~”字符或“}”之间的所有字符。 //第三个组是非捕获组,用于查找下一部分开始的分隔符。 变量 正则表达式=/(^ | 9N | 1T | D | S)(.*)(:~$)/g, 数据={}, match=regex.exec(输入); while(匹配!==null){ 开关(匹配[1]){ 案例'9N': data.PPN=匹配[2]; 打破 案例“1T”: data.batch=匹配[2]; 打破 案例“D”: data.expireDate=匹配[2]; 打破 案例S: data.serial=匹配[2]; 打破 } var msg='Found'+match[0]+'/identifier='+match[1]+'/value='+match[2]+'; 控制台日志(msg); //参加下一场比赛。 match=regex.exec(输入); } 返回数据; } 变量输入=']d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765}', 输入2=']d1[)½}06~9N110375286414~D150600~1T12345ABCD~S12345ABCDEF98765}'; log(getData(input));
console.log(getData(input2));这里的问题是,如果我切换序列,正则表达式将不起作用。例如,如果将9N分隔符放在末尾而不是S分隔符。@zaq看一下我的解决方案,它使用正则表达式,但没有这个问题。@Thijs是的,您的解决方案有效。我只是想在这篇评论中报告它,以便Robin能够更好地给出答案很好。非常感谢!有什么方法可以让我跳过最后两个字符吗?在我给出的示例中是
}
但是,我想总是跳过最后两个字符。
input=input.slice(0,input.length-2)
我保持正则表达式的原样?当您删除最后一个字符时,正则表达式也需要更改。我更新了答案以反映这一点。
var string = "]d1[)½}06~9N110375286414~1T12345ABCD~D150600~S12345ABCDEF98765} "

var substrings = string.split('~');
substrings.shift(); //get rid of irrelevant first array element
substrings[substrings.length-1] = substrings[substrings.length-1].replace("} ", "");