【问题标题】:Extract delimited groups of digits from the string [duplicate]从字符串中提取分隔的数字组[重复]
【发布时间】:2020-03-19 21:19:02
【问题描述】:

这里是正则表达式新手,我需要帮助!我想创建一个广泛的正则表达式,它匹配文本中的电话号码(任何国际格式)并只返回数字。我还有其他功能可以根据国家/地区进一步验证数字,所以我不担心这个正则表达式。我主要只需要从文本中删除数字,但每个数字都是分开的。此外,数字分隔符可以包含 +-.() 或单个空格。

例子

This is some text with +1 (234) 222-9898 a phone number in it and a random number 12.  Also here is a +44 0800 655 5059 UK number

我希望正则表达式只返回

['12342229898', '12', '4408006555059']

感谢您的帮助,如果您需要更多要求,请告诉我!

【问题讨论】:

  • 看起来您正在寻找创建一个正则表达式,但不知道从哪里开始。请查看Reference - What does this regex mean 资源,它有很多提示。此外,请参阅 Learning Regular Expressions 帖子了解一些基本的正则表达式信息。一旦您准备好表达方式,但解决方案仍然存在问题,请使用最新的详细信息编辑问题,我们很乐意帮助您解决问题。
  • @WiktorStribiżew 我意识到我可能应该学习如何构建正则表达式,而且我确实了解一些基础知识。话虽如此,我只是在寻找一个快速的解决方案,而不是“如何做正则表达式”资源的链接。我最终有一天会花时间学习如何自己编写它

标签: javascript regex match


【解决方案1】:

将数字与空格和分隔符匹配,然后在事后以编程方式清除不需要的字符。表达式示例:

/(?:\+\d+)?(?:[-+. ]?(?:\(\d+\)|\d+))+/g

编辑:更正了量词。抱歉,应该先测试一下表达式。 ^^

【讨论】:

  • 嘿,很好,我刚刚尝试过,它可以工作...有没有办法修改它以不使用 javascript 匹配函数返回空字符串?还是我只需要单独过滤掉它们?
  • @DevonNorris :说它有效,但它返回一堆空字符串和带有所有大括号/加号/空格/等的数字组,这很奇怪
  • @DevonNorris 如果您决定使用正则表达式来完成此任务,那么在事后运行清理会容易得多。
  • @DevonNorris 我不知道空字符串是什么意思;原来我应该先测试表达式。量词错误,抱歉。
  • @oriberu 啊是的,这行得通!很抱歉没有澄清
【解决方案2】:

完整的解决方案

要获得简单的数字组,可以

str.match(/((\d+)[\W]+)+/g)
  • 通过替换所有非数字 (\D) 字符来清理结果
.map(chunk => chunk.replace(/\D/g,''))

实时 sn-p 作为概念证明:

const str = 'This is some text with +1 (234) 222-9898 a phone number in it and a random number 12.  Also here is a +44 0800 655 5059 UK number',

      digits = str
        .match(/((\d+)[\W]+)+/g)
        .map(chunk => chunk.replace(/\D/g,''))
      
console.log(JSON.stringify(digits))
.as-console-wrapper{min-height:100%;}

【讨论】:

  • 感谢您的建议,但我正在尝试寻找正则表达式解决方案。这将涉及从网页中解析文本,对于包含数千行文本的页面,此解决方案会显着减慢速度
  • 非常强大,很酷。
  • 我会尝试并回复您。我想我虽然出于某种原因正则表达式更快?
【解决方案3】:

我会分两个单独的步骤来完成。第一个会找到您正在搜索的块。那是混合了一些特殊字符的数字[ "+", "-", "(", ")" ]。第二步将仅从每个块中提取数字。

第 1 步 - 寻找方块

([[0-9]+[ \+\-\(\)[0-9]*]*]*)

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

(                         # find each block that
  [                       # provide these values
     [0-9]+               # starts with some number
     [ \+\-\(\)[0-9]*]*   # then, may have any of these special chars or numbers
  ]*                      # repeated times
)                         # end of the block

之后,您将获得带有数字的块列表:

[
   "1 (234) 222-9898 ",
   "12",
   "44 0800 655 5059"
]

第 2 步 - 仅提取每个块的编号

对于这些元素中的每一个,我会使用一些简单的函数,只提取字符串的数字元素

let text = "1 (234) 222-9898"
let letters = text.split("")
let numbers = "0123456789"
let only_numbers_from_text = letters
    .filter( letter => numbers.indexOf(letter) > -1 )
    .join("")
console.log( only_numbers_from_text )

可能不是单行解决方案。但我认为是最容易理解和维护的。

【讨论】:

猜你喜欢
  • 2021-12-10
  • 2021-07-31
  • 2021-10-25
  • 1970-01-01
  • 2018-12-14
  • 2018-02-05
  • 1970-01-01
  • 2021-11-22
  • 2017-02-17
相关资源
最近更新 更多