javascript Regex -字符第二次出现后捕获

vc9ivgsu  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(123)

我有一串号码
1.01.01.01
1.01.01.02
1.01.02.03
我需要在第二次出现**'.0'后的数字上加1:
一点零一分
零二分零一分
一点零一分
零二分零二分
一点零一分
零三分
我正在使用javascript。我已经尝试了一些东西,但我只是得到这么混乱与regex哈哈。
我一直在玩,split可能是一种方法,谢谢Richard,有人知道在字符串中的01上递增+1,或者我需要先分解字符串,然后把它变成整数吗?

bxgwgixi

bxgwgixi1#

您可以使用此代码片段完成以下步骤中的工作:
1.按.0拆分输入字符串
1.将第二个元素转换为Integer并递增1
1.将结果元素存储在数组ret
1.再次将ret的元素与.0连接,并将新字符串保存到result数组中
1.最终显示result数组

代码:

const arr = ['1.01.01.01','1.01.01.02', '1.01.02.03'];
const delim = '.0';
var result = [];

arr.forEach(str => {
  ret = [];
  str.split(delim).forEach((el, i) => 
     ret.push(i==2 ? parseInt(el)+1 : el)
  );
  result.push(ret.join(delim));
});

console.log(result);
3j86kqsm

3j86kqsm2#

基于split和/或非正则表达式的方法可以像下面的代码一样直接实现(当然不能控制解析的第三个参数的有效性,该参数被假定为数字(序列))...

const sampleData = [
  '1.01.01.02',
  '1.01.02.03',

  '1.01.0x.04',
  '1.01.0x.0x',

  '1.01.001.01.07.08.09',
  '1.01.013.03.01200230',
];

console.log(
  sampleData, '=>',

  sampleData.map(item => {
    const [leadingA, leadingB, digits, ...trailing] = item.split('.0');
    return [
      leadingA, leadingB, (parseInt(digits, 10) + 1), ...trailing
    ].join('.0');
  })
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

更精确(边缘情况)的基于replace的方法需要更复杂的capturing正则表达式,如... /^((?:.*?\.0){2})(\d+)(.*)/...,以及作为其第二个参数的replacer函数。
正则表达式... /^((?:.*?\.0){2})(\d+)(.*)/...读起来像这样...

  • 第1部分:^( (?:.*?\.0){2} )
  • 从行开始^捕获( ... )以下匹配...
  • (?: ... ){2}...两次{2}一个未捕获的?:( ... )具有以下模式...
  • .*?0...以非?贪婪方式执行任何.*,直到出现点零序列.0
  • 第2部分:(\d+)
  • 捕获至少一个数字。
  • 第3部分:(.*)
  • 捕获( ... )任何.*贪婪的内容,直到字符串结束。

相关的replacer函数是replace的回调函数,它将整个匹配(第一个参数)作为参数传递,然后将每个捕获的值作为单独的参数传递,从第一个捕获开始,到最后一个捕获结束。
因此,对于给定的示例,替换函数的参数名称(可以自由选择)和优先级为... (match, leading, digits, trailing)...其中digits是第二个捕获组,OP希望成为递增整数的数字(序列)。
解决方案可能类似于下面提供的示例代码...
一个二个一个一个

相关问题