使用JavaScript从数组中删除所有字母和前导零的字符串

3
感谢您抽出时间阅读我的问题。
我需要从一个数组的字符串元素中删除所有字母字符和前导零。该数组将类似于以下内容:
["DE73456","DE71238","FR00034","FR00036","ES00038","US00039","DE00098", ...]
结果应该是以下整数数组:
[73456, 71238, 34, 36, 38, 39, 98, ...]
最终,我想确定这些升序排列的数字中被省略的最小值。我已经找到了一个JS函数,通过传递一个整数数组可以完成这项工作,并且它完全按照预期运行。
也许我们可以将上述要求与下面的JS函数结合起来,以确定最小的省略值。
var k = [73456,71238,34,36,38,39,98];

k.sort(function(a, b) { return a-b; });   // To sort by numeric

var offset = k[0];
var lowest = -1;
for (i = 0;  i < k.length;  ++i) {
  if (k[i] != offset) {
    lowest = offset;
    break;
  }
  ++offset;
}
if (lowest == -1) {
    lowest = k[k.length - 1] + 1;
}
return lowest;

简而言之,我想确定一个字符串数组中最小的被省略的值

["DE73456","DE71238","FR00034","FR00036","ES00038","US00039","DE00098", ...]

因此,JS函数的结果应该返回上述例子中的35

非常感谢您的建议!我期待着阅读您的评论。


也许这个问题会有帮助: https://dev59.com/5msz5IYBdhLWcg3wpZhF - Raghav Garg
如果您从字符串中删除所有字符,那么该字符串将为空。我想您是指“字母字符”? - JoelFan
1
你是对的 @JoelFan,这个问题在这方面表述得不是很清楚。我编辑了问题 - 感谢你指出这一点! - nairolf
4个回答

3
你可以使用这个简单的正则表达式替换:
repl = str.replace(/^[a-zA-Z]+0*/, "")

正则表达式演示

正则表达式细节:

  • ^:开始
  • [a-zA-Z]+:匹配一个字母
  • 0*:匹配零个或多个 0
  • 替换成一个空字符串

3
您还可以使用单个字符类^[A-Z0]+来匹配从字符串开头^开始的一个或多个A-Z或0的出现,然后使用数组映射。
s = s.replace(/^[A-Z0]+/, "")

const a = ["DE73456", "DE71238", "FR00034", "FR00036", "ES00038", "US00039", "DE00098"];
console.log(a.map(s => s.replace(/^[A-Z0]+/, "")))


2
非常感谢!合并后的代码确实完成了任务。`const a = ["DE73456", "DE71238", "FR00034", "FR00036", "ES00038", "US00039", "DE00098"]; console.log(a.map(s => s.replace(/^[A-Z0]+/, "")))var k = a.map(s => s.replace(/^[A-Z0]+/, ""));k.sort(function(a, b) { return a-b; }); // To sort by numericvar offset = k[0]; var lowest = -1; for (i = 0; i < k.length; ++i) { if (k[i] != offset) { lowest = offset; break; } ++offset; } if (lowest == -1) { lowest = k[k.length - 1] + 1; } console.log("Lowest = " + lowest);` - nairolf

2
您也可以使用match而不是删除不需要的字符。
str = "FR00034"
str.match(/[1-9][0-9]*/)

正则表达式细节:

  • [1-9]:第一个字符应该是非零数字
  • [0-9]*:所有后续数字

获取所有最小值的最终函数应该类似于这样。

function getLowestOf() {
    const numbers = arr.map((item) => Number(item.match(/[1-9][0-9]*/)[0]));
    const sorted = numbers.sort((a, b) => a - b);
    // console.log(sorted);
    return sorted[0];
}
const arr = ["DE73456","DE71238","FR00034","FR00036","ES00038","US00039","DE00098"];
console.log(getLowestOf(arr))


1
对于提供的列表示例,像 正则表达式 这样的…(/ ^ [0\D]+ /)…已经足够用于字符串{{link3:replace}}操作。 由于这个任务,以及将字符串转换为数字值的附加任务,必须针对每个数组项进行处理,因此想要使用{{link5:Array.prototype.map }}。
为了实现OP所希望的最终结果,必须实现一个函数,从无序整数列表中获取最低省略值...

const sampleList = ["DE73456","DE71238","FR00034","FR00036","ES00038","US00039","DE00098"];

// for the above samples a regex like ... /^[0\D]+/ ... already
// is sufficient enough ... [https://regex101.com/r/ZSDGvC/1/]

// an unsorted list of integers ...
console.log(
  sampleList
    .map(sample => Number(sample.replace((/^[0\D]+/), '')))
);


function getLowestOmittedValueFromIntegerList(list) {
  let lowestOmittedInteger;
  let hasOmittedValue = false;

  const maximumListCount = (list.length - 1);

  // use shallow copy for not mutating the original
  // ... and sort this new array in ascending order.
  list = Array.from(list).sort((a, b) => (a - b));

  // look for omitted value, save it and exit early.
  list.some((integer, idx) => {

    if (idx < maximumListCount) {
      if ((integer + 1) < list[idx + 1]) {

        lowestOmittedInteger = (integer + 1);
        hasOmittedValue = true;
      }
    }
    return hasOmittedValue;
  });

  return lowestOmittedInteger;
}

// the lowest omitted value from an unsorted list of integers ...
console.log(
  getLowestOmittedValueFromIntegerList(
    sampleList
      .map(sample => Number(sample.replace((/^[0\D]+/), '')))
  )
);

// proof of concept ...
console.log('\nproof of concept ...\n\n');

console.log( // expect the undefined value
  getLowestOmittedValueFromIntegerList([9,8,7,6,6,6,5,4,3,2,1,0])
);
console.log( // expect 7 
  getLowestOmittedValueFromIntegerList([9,8,6,6,6,5,4,3,2,1,0])
);

console.log( // expect 11
  getLowestOmittedValueFromIntegerList([0,1,2,3,4,5,6,7,8,9,10,12])
);
console.log( // expect the undefined value
  getLowestOmittedValueFromIntegerList([0,1,2,3,4,5,6,7,8,9,10,11,12])
);

console.log( // expect -1
  getLowestOmittedValueFromIntegerList([-4,-3,-2,0,1,2,3,4])
);
console.log( // expect -2
  getLowestOmittedValueFromIntegerList([-4,-3,-1,0,1,2,3,4])
);
.as-console-wrapper { min-height: 100%!important; top: 0; }


谢谢Peter。不过,我正在寻找结果整数数组范围内未使用的最小数字。感谢你的帮助。 - nairolf
@nairolf ... 对于提供的示例,它将是什么?从您的解释中并不十分清楚。它会是36吗,因为这个数字序列在所有提取的数字中都没有出现? - Peter Seliger
这将是35。如果您查看字符串数组的此部分,则35将是结果整数数组范围内最低未使用的数字。["FR00034","FR00036","ES00038","US00039"] - nairolf
哪一个是...“从升序排列的数字列表中获取最低的省略值”...范围是另一回事...无论如何,我已经在处理它了... - Peter Seliger
感谢您的澄清和帮助。非常感谢! - nairolf
抱歉,我的错。我是新来的,当时已经很晚了,似乎我点赞了错误的建议。我已经更正了。再次感谢您的帮助! - nairolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接