javascript 正则表达式:我有一系列的字符,我正在寻找,但我想限制可能的数量重复的一些

drnojrws  于 2023-10-14  发布在  Java
关注(0)|答案(2)|浏览(106)

我正在尝试创建一个正则表达式来查找文本中的电话号码。电话号码的格式是未知的,这是一个相当复杂的主题,所以我试图保持它尽可能简单,只是找到可能的电话号码(我可以检查他们以后,例如,libphoneber-js)。
这就是我目前所拥有的:

/\+?[\d(][\d()\- ]{3,}\d/g

此正则表达式查找满足以下条件的电话号码:
1.它可以有“+”或没有
1.然后会有一个数字或左括号
1.然后只是字符范围(数字,括号,破折号或空格,至少3个)
1.会得到一个数字
但我的正则表达式在以下情况下失败:

  • “+(651)-234-2345(332)-445-12345”,所以在这里我们看到,用户未能正确格式化电话号码,忘记添加“+",因为括号可以重复多次,因为他们想要的,我捕捉它作为一个长号码
  • “+(651)-234-2345(332)-445-12345”和以前一样,但现在用户甚至忘记了添加空间
    **有没有一种方法可以说,括号只能打开和关闭一次,或者类似的东西?**我的意思是它们可以出现在数字的任何地方,不仅在开始时,而且只出现一次。

我在这里有一个Playground:https://regexr.com/7lgni正如您所看到的,大多数电话号码都按预期突出显示。

yhxst69z

yhxst69z1#

不要把()和数字混在一起。只需匹配一个以(开始,以)结束的可选序列,中间有数字。然后匹配之后的数字、破折号和空格的组合。

\+?(?:\(\d+\))?[\d\-\s]{3,}\d

DEMO

0pizxfdo

0pizxfdo2#

考虑到单个可选括号对的宽松要求,
破折号后无数字。

\+?(?:(?:(?:\(\d+\))[\d -]*|\d[\d -]*(?:\(\d+\))?[\d -]*)\d)(?![\d-])

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

\+? 
(?:
   (?:
      (?: \( \d+ \) )               # Parenth at beginning
      [\d -]*  
    | 
      \d 
      [\d -]* 
      (?: \( \d+ \) )?              # Optional parenth in the middle
      [\d -]* 
   )
   \d 
)
(?! [\d-] )

相关问题