【问题标题】:How do I get the middle value of a string using Regexp in JS?如何在 JS 中使用 Regexp 获取字符串的中间值?
【发布时间】:2021-03-24 11:32:33
【问题描述】:

我需要获取除卡号的前 6 位和后 4 位之外的所有内容,没有特殊字符,这是一个字符串,可以如下:

4500 1234 5678 7654 要么 4500-1234-5678-7654

所以我需要得到:345678

到目前为止,我能够使用以下方法得出逆值:

^(\d[\- ]?){6}|[\- ]|(\d[\- ]?){4}$

注意:由于 Nodejs 中的业务特定用例,我使用 match() 而不是 replace()。

更新: 谢谢,到目前为止大家的帮助!如果可能,它实际上需要在一个功能中。此外,信用卡的长度从 13 位到 18 位不等,这使得依靠其长度或位置来获得中间值是有问题的。

【问题讨论】:

  • 使用正则表达式删除除数字以外的所有内容,然后使用substr()
  • 你不能用一个正则表达式来做到这一点。

标签: javascript node.js regex regex-negation


【解决方案1】:

可以使用第二组(\d{4}[ -]+\d{2})(\d{2}[ -]*\d{4})

https://regex101.com/r/CFoh7m/1

【讨论】:

  • 这将在结果中包含标点符号。
  • 谢谢,很接近!但问题是卡的长度可能是 13 到 18 位数字,这只会捕获其中的一部分。同样正如@Barmar 所指出的,它将包括标点符号。
【解决方案2】:

您需要分两步完成。首先,使用正则表达式替换删除所有非数字。然后使用substring() 获取所需的子字符串。

function middle_digits(cardnum) {
  let nondigits = cardnum.replace(/\D/g, '');
  return nondigits.substring(6, nondigits.length-4);
}
console.log(middle_digits('4500 1234 5678 7654'));
console.log(middle_digits('4500-1234-5678-7654'))

【讨论】:

  • slice,可以传递一个否定的endIndex,函数变为:return cardnum.replace(/\D/g, '').slice(6, -4);
  • 那还是两步,还以为是单行呢。
【解决方案3】:

我认为使用单个正则表达式无法满足上述要求,不包括填充符(空格和破折号)。您可以匹配多个组,然后将它们组合起来。或者,您可以匹配所需的范围,然后过滤掉填充物。这是后一种方法:

const input = [
  '4500 1234 5678 7654',
  '4500-1234-5678-9012',
  '1234-5678-9012-3',
  '1234-5678-9012-3456-78'
];
const regex = /(?<=^(\d(?:[^\d]?)){6})((?:\d[^\d]?){3,})(?=(?:\d[^\d]?){4}$)/;
input.forEach(str => {
  let matched = str.match(regex);
  let cleaned = matched[0].replace(/[^\d]/g, '');
  console.log(str);
  console.log('=> matched: ' +matched);
  console.log('=> cleaned: ' +cleaned);
});

输出:

4500 1234 5678 7654
=> matched: 34 5678 ,4,34 5678 
=> cleaned: 345678
4500-1234-5678-9012
=> matched: 34-5678-,4,34-5678-
=> cleaned: 345678
1234-5678-9012-3
=> matched: 78-9,1,78-9
=> cleaned: 789
1234-5678-9012-3456-78
=> matched: 78-9012-34,1,78-9012-34
=> cleaned: 78901234

解释:

  • (?&lt;=^(\d(?:[^\d]?)){6}) - 从 6 个数字开始进行正向后视扫描,每个数字后跟可选的填充符
  • ((?:\d[^\d]?){3,}) - 捕获组,期望 3+ 个数字,每个数字后跟可选的填充符
  • (?=(?:\d[^\d]?){4}$) - 正向前瞻扫描 4 个数字,每个数字后跟可选的填充符,直到字符串结尾

【讨论】:

    猜你喜欢
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2022-08-03
    相关资源
    最近更新 更多