【问题标题】:Javascript REGEX to find credit card number in string and maskJavascript REGEX 在字符串和掩码中查找信用卡号
【发布时间】:2018-07-13 04:39:16
【问题描述】:

我想搜索一个字符串并屏蔽信用卡以确保安全。

"Hi here is my card number its visa 4242 4242 4242 4242"
"Hi here is my card number its visa 4242424242424242"
"Hi here is my card number its visa 4242-4242-4242-4242"

应转换为:

"Hi here is my card number its visa **** **** **** 4242"

我需要用 Javascript 在客户端上执行此操作。我知道网络上有很多资源和问题。

我找到了两个正则表达式,但都抛出错误:“Uncaught SyntaxError: Invalid or unexpected token”

"Hi here is my card number its visa 4242 4242 4242 4242".match("(\d{4}-?){4}")

"Hi here is my card number its visa 4242 4242 4242 4242".match(\b4\d{3}[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}[ -]\b)

我觉得表达式和JS不兼容?

我也知道他们会返回字符串,然后我会转换字符串(屏蔽它),然后对原始字符串使用简单的替换。

谁能帮我解决这个问题的正则表达式部分?

【问题讨论】:

  • 你应该看看javascript中正则表达式的语法:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
  • 有人能解释为什么这些问题被否决了吗?在 SO 上提出任何问题似乎越来越难,有人可以解释一下这个问题在哪里没有得到批准吗?
  • @MartinWebb 我也不确定。您遇到的原始问题是 \d 无效。你需要逃离\。除了您需要将模式包装在/ 中之外,第二个示例还可以工作。此外,[ -]\b 在您的情况下不会匹配任何内容,因为 \b 匹配单词字符和非单词字符(或行首/行尾)之间的位置。老实说,我认为您的问题被否决了 1. 没有使用降价(我编辑了您的问题以使其更清晰)和/或 2. 因为人们 assume 每个人都应该知道您需要逃避@ 987654333@ 或分隔正则表达式模式
  • @KyleFairns 我同意你的观点。想看整洁的吗? stackoverflow.com/questions/30791292/… 68 票反对。

标签: javascript regex


【解决方案1】:

正则表达式可以作为字符串".." 或正则表达式对象/../ 传递。 (当作为字符串传递时,它会像 new RegExp("..") 一样转换为 RegExp 对象)。

在第一种情况下,由于双引号之间的特殊含义,反斜杠必须加倍。

 "Hi here is my card number its visa 4242 4242 4242 4242".match("\\b(\\d{4}[- ]?){4}")

 "Hi here is my card number its visa 4242 4242 4242 4242".match(/\b(\d{4}[- ]?){4}/)

【讨论】:

  • 否决我的回答是关于语法问题,OP 不知道
【解决方案2】:

See regex in use here

\b(?:\d{4}[ -]?){3}(?=\d{4}\b)
  • \b 将位置断言为单词边界。如果您想捕获 My visa is1234567812345678 等案例,您可以删除它
  • (?:\d{4}[ -]?){3} 准确匹配以下 3 次
    • \d{4} 匹配任意数字 4 次
    • [ -]? 可选择匹配空格或连字符
  • (?=\d{4}\b) 正向前瞻确保后面是 4 位数字(并确保后面不是单词字符)。与我的第一点类似,捕捉卡号后跟诸如My visa is 1234567812345678please use it carefully 之类的词,请改用(?=\d{4}(?!\d))

const r = /\b(?:\d{4}[ -]?){3}(?=\d{4}\b)/gm
const a = [
  "Hi here is my card number its visa 4242 4242 4242 4242",
  "Hi here is my card number its visa 4242424242424242",
  "Hi here is my card number its visa 4242-4242-4242-4242"
]
const subst = `**** **** **** `

a.forEach(function(s) {
  console.log(s.replace(r, subst))
})

【讨论】:

  • 我很困惑为什么人们会在社区乐于解决问题时提出问题并投反对票。你的回答很完美——谢谢。
  • @MartinWebb 不用担心!我很高兴能帮上忙:)
猜你喜欢
  • 2014-08-05
  • 2015-01-16
  • 2018-10-19
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多