javascript 如何获取字符串中特定子字符串之后的第一个子字符串?

slwdgvem  于 12个月前  发布在  Java
关注(0)|答案(3)|浏览(134)

我有多个文本文件,我想处理,并获得版本号的'香蕉'包部分,这里有一个例子:

Package: apple
Settings: scim
Architecture: amd32
Size: 2312312312

Package: banana
Architecture: xsl64
Version: 94.3223.2
Size: 23232

Package: orange
Architecture: bbl64
Version: 14.3223.2
Description: Something descrip
 more description to orange

Package: friday
SHA215: d3d223d3f2ddf2323d3
Person: XCXCS
Size: 2312312312

字符串
我所知道的:

  • Package:[name]始终是节中的第一行。
  • 并非所有部分都有Package:[name]行。
  • Package:banana部分总是有一个Version:行。
  • 版本:行顺序不同。(可以是第二行、第五行、最后一行..)
  • 包:香蕉节的顺序是不同的。它可以在文件的开始,中间,结尾。
  • 版本:[编号]总是不同

我想找到香蕉包部分的版本号,所以从例子中94.3223.2。我不想通过硬编码循环逐行找到它,但用一个很好的解决方案来做。
我尝试过这样的方法,但不幸的是,它并不适用于所有场景:

firstOperation = textFile.split('Package: banana').pop();
secondOperation = firstOperation.split('\n');
finalString = secondOperation[1].split('Version: ').pop();


我的逻辑是:
1.查找软件包:banana line
1.在找到包香蕉行后,检查第一次出现的“Version:”,然后从此行中提取版本号。
这个数据处理将是一个nodeJs端点。

bqf10yzr

bqf10yzr1#

为了使其更具可扩展性,您可以将其转换为对象:

function process(input) {
  let data = input.split("\n\n"); // split by double new line
  data = data.map(i => i.split("\n")); // split each pair
  data = data.map(i => i.reduce((obj, cur) => {
    const [key, val] = cur.split(": "); // get the key and value
    obj[key.toLowerCase()] = val; // lowercase the value to make it a nice object
    return obj;
  }, {}));
  return data;
}

const input = `Package: apple
Settings: scim
Architecture: amd32
Size: 2312312312

Package: banana
Architecture: xsl64
Version: 94.3223.2
Size: 23232

Package: orange
Architecture: bbl64
Version: 14.3223.2
Description: Something descrip
 more description to orange

Package: friday
SHA215: d3d223d3f2ddf2323d3
Person: XCXCS
Size: 2312312312`;

const data = process(input);
const { version } = data.find(({ package }) => package === "banana"); // query data
console.log("Banana version:", version);

字符串

vh0rcniy

vh0rcniy2#

这些类型的文本提取总是非常脆弱的,所以让我知道这是否适用于您的实际输入.无论如何,如果我们用空行分割(实际上只是双换行符,\n\n),然后用\n分割每个“段落”,我们可以使用的行块。
然后我们可以找到包含banana包的块,然后在该块中,我们找到包含版本的行。
最后,我们切掉Version:以获得版本文本。

const text = `\
Package: apple
Settings: scim
Architecture: amd32
Size: 2312312312

Package: banana
Architecture: xsl64
Version: 94.3223.2
Size: 23232

Package: orange
Architecture: bbl64
Version: 14.3223.2
Description: Something descrip
 more description to orange

SHA215: d3d223d3f2ddf2323d3
Person: XCXCS
Size: 2312312312
`;

const chunks = text.split("\n\n").map((p) => p.split("\n"));

const version = chunks
    .find((info) =>
        info.some((line) => line === "Package: banana")
    )
    .find((line) =>
        line.startsWith("Version: ")
    )
    .slice("Version: ".length);
    
console.log(version);

字符串

8xiog9wr

8xiog9wr3#

const data = `
Package: apple
Settings: scim
Architecture: amd32
Size: 2312312312

Package: banana
Architecture: xsl64
Version: 94.3223.2
Size: 23232

Package: orange
Architecture: bbl64
Version: 14.3223.2
Description: Something descrip
more description to orange

Package: friday
SHA215: d3d223d3f2ddf2323d3
Person: XCXCS
Size: 2312312312
`;

const packages = data.split("\n\n").map((packageData) => {
  return packageData.split("\n").reduce((packageObj, line) => {
    const [key, value] = line.split(":").map((item) => item.trim());
    return { ...packageObj, [key]: value };
  }, {});
});

const bananaPackage = packages.find((pkg) => pkg.Package === "banana");

if (bananaPackage) {
  console.log(`"Banana" packet version: ${bananaPackage.Version}`);
} else {
  console.log('Package "Banana" not found.');
}

字符串

相关问题