我想将string
分成2种样式,以便我得到正确的商品
我想在
之间的字符串下面分割 _333/4444.json
或_(3 or 4 numbers).json
以下是我的模式:
"test_halloween Party 10 AM - 12:30 PM party_560.json"
"Kaulampur 1110 reva_2018 RR_999 Roadrover_4987.json"
基于:
_560.json
_4987.json
最终输出:
1)560
2)4987
这是我尝试过的事情:
var str1 = "test_halloween Party 10 AM - 12:30 PM party_560.json";
var str2 = "Kaulampur 1110 reva_2018 RR_999 Roadrover_4987.json";
var res1 = str1.split(/_./)[0];
var res2 = str2.split(/_./)[0];
console.log(res1);
console.log(res2);
注意:一个模式应该同时给我两个results
答案 0 :(得分:3)
可以随意投票,但是我会这样解决(比预编译的正则表达式要慢):
function myFunc(s) {
let i = s.lastIndexOf("_");
let j = s.indexOf(".", i);
return s.substring(i+1, j);
}
console.log(
myFunc("test_halloween Party 10 AM - 12:30 PM party_560.json"),
myFunc("Kaulampur 1110 reva_2018 RR_999 Roadrover_4987.json")
);
对注释中提到的手工编码DFA感兴趣的任何人:
function myFunc(s) {
const MAX = 10;
t = s.substr(-MAX);
for (let i=0; i<MAX; i++) {
let z = "";
if (t[i] === "_") {
i++;
if (isd( t[i] )) {
z += t[i];
i++;
if (isd( t[i] )) {
z += t[i];
i++;
if (isd( t[i] )) {
z += t[i];
i++;
const IS_DOT = 1;
const IS_DIGIT = 2;
let x = (t[i] === ".")
? IS_DOT
: (isd(t[i]))
? IS_DIGIT
: 0;
OUT:
while (true) {
switch (x) {
case IS_DOT:
i++;
if (t.substring(i) === "json") {
return z;
}
break;
case IS_DIGIT:
z += t[i];
i++;
x = IS_DOT;
break;
default:
break OUT;
}
}
}
}
}
}
}
return null;
}
function isd(c) {
let x = c.charAt(0);
return (x >= "0" && x <= "9");
}
console.log(
[
"_asnothusntaoeu_2405.json",
"_asnothusntaoeu_105.json",
"_asnothusntaoeu_5.json",
"_asnothusntaoeu.json",
"_asnothusntaoeu_5json",
"_asnothusntaoeu_5.jso",
"_asnothusntaoeu_105.json"
].map(s => myFunc(s))
);
答案 1 :(得分:3)
尝试使用正则表达式。
以下是它们工作方式的很好的入门指南:https://www.codepicky.com/regex/
/_(\d{3,4})\.json$/
这种模式是怎么回事?
/
的开始和结束只是定义模式的书挡_
文字将匹配数字前面的下划线(\d{3,4})
定义了一个“捕获组”,它完全匹配3或4个连续数字。这很方便,因为它使我们可以从整体模式中分别提取所需的数字。\.json$
与字符串.json
匹配(您必须用斜杠将句号转义,因为它是一个特殊的正则表达式字符),而$
则将其强制放在字符串末尾示例:
let result1 = "test_halloween Party 10 AM - 12:30 PM party_560.json".match(/_(\d{3,4})\.json$/);
// result1[1] === 560
let result2 = "Kaulampur 1110 reva_2018 RR_999 Roadrover_4987.json".match(/_(\d{3,4})\.json$/);
// result2[1] === 4987
let result3 = "this string will not match".match(/_(\d{3,4})\.json$/);
// result === null
正则表达式极为灵活,精确且快速。请看一下该基准测试,并将其与字符串索引查找替代项进行比较:http://jsben.ch/lbfUt
答案 2 :(得分:0)
尝试这个var res1 = /([0-9]+)\.json$/.exec(str1)[1];
答案 3 :(得分:0)
这就像教科书中的情况,仅当您想使用正则表达式时。像这样:
// Select all things of the form "_<numbers>.json" from
// the string, and parse out <numbers> as a match.
var MyRegEx = /_(\d+)\.json/i;
var str1 = "test_halloween Party 10 AM - 12:30 PM party_560.json";
var res1 = MyRegEx.exec(str1)[1];
var str2 = "Kaulampur 1110 reva_2018 RR_999 Roadrover_4987.json";
var res2 = MyRegEx.exec(str2)[1];
console.log(res1);
console.log(res2);
应该可以解决问题。