【问题标题】:Using RegExp to match parentheses with set number of characters inside使用 RegExp 匹配括号内的字符数
【发布时间】:2017-07-31 18:40:21
【问题描述】:

我正在尝试编写一个正则表达式,它将匹配1 (555) 555-5555(555) 的括号并将括号替换为空。但是,如果只有一个括号,例如1 555)555-5555,或者括号内的数字/字符超过三个,例如(6505552368),则不应匹配。

我最好的尝试似乎是这样

re = /\((?=.{3})/;

但它只会匹配并替换第一个括号,这没有多大帮助。任何想法都将不胜感激。

【问题讨论】:

标签: javascript regex


【解决方案1】:

如果您需要删除字符串中3位左右的第一个括号,您可以使用

s.replace(/\((\d{3})\)/, '$1')

regex demo

详情

  • \( - ( 文字符号
  • (\d{3}) - 第 1 组(稍后称为 $1 反向引用)
  • \) - 文字 )
  • $1 - 对第 1 组的反向引用。

或者,如果您只需要删除恰好出现在零个或多个数字/空格之后的两个括号,请使用

s.replace(/^([\d\s]*)\((\d{3})\)/, '$1$2')

another regex demo

详情

  • ^ - 字符串开头
  • ([\d\s]*) - 第 1 组(后来称为 $1):0+ 位或/和空格
  • \( - 一个 ( 字符
  • (\d{3}) - 第 2 组捕获 3 位数字
  • \) - 文字 )

这里,$1$2,需要两个反向引用来恢复() 之外的文本。

【讨论】:

  • 这看起来比我的解决方案好得多。 +1
【解决方案2】:

不确定这是否是最好的正则表达式,但这会起作用。

正则表达式:(?:^|()(\d{3})(?:)|$)

出于演示目的,我已将 () 替换为 _

var regex = /(?:^|\()(\d{3})(?:\)|$)/g;
var str = "1 (555) 555-5555 (1234), or (123 or 123)";

console.log(str.replace(regex, "_$1_"))

据我了解,@Wiktor 的回答比较好。不过还是把我的回答作为参考。

【讨论】:

  • 为什么不只是/\((\d+?)\)/g
  • 是的。看到 Wiktor 的回答,我想这是更好的解决方案。不知道这个解决方案有多糟糕。我想我会保留这个答案作为替代。如果您觉得这很糟糕,请随时投票。 :-)
【解决方案3】:

试试这个:^\d+(\d\d\d)\d+-?\d+$

它接受括号后的单号登录,括号内只有 3 位数字。

【讨论】:

    【解决方案4】:

    我稍微改变了 Rajesh 的解决方案,所以每个括号都将被替换为空。

    var patt = /\((\d{0,3})\)/g;
    var str = '55 (555) 555-(55)55';
    console.log(str.replace(patt, "$1"));
    

    但如果您需要替换嵌套括号,它并不能解决。为此,您可以使用以下代码:

    var patt = /\((\d{0,3})\)/g;
    var str = '55 (5(5)(((5)))) 555-(55)55';
    while(str.match(/\((\d{0,3})\)/g))
    {
        str = str.replace(patt, "$1");
    }
    console.log(str);
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多