如何在JavaScript中的2种模式之间分割字符串

时间:2018-11-01 17:59:54

标签: javascript jquery node.js regex string

我想将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

4 个答案:

答案 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$/

这种模式是怎么回事?

  1. /的开始和结束只是定义模式的书挡
  2. _文字将匹配数字前面的下划线
  3. (\d{3,4})定义了一个“捕获组”,它完全匹配3或4个连续数字。这很方便,因为它使我们可以从整体模式中分别提取所需的数字。
  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);

应该可以解决问题。