【问题标题】:need Regexp which leave only two dashes in a string需要正则表达式,它在字符串中只留下两个破折号
【发布时间】:2022-11-29 00:54:26
【问题描述】:

我有一个像 d333-4444-555--5---5- 这样的字符串
并且只想抓住前两个破折号并获得 333-4444-55555
如果它是前两个和两个连续的,两个变成一个像: d333--4444-555--5---5- 去 333-4444-55555

任何建议或现成的解决方案

我开始 console.log('d-45----'.replace(/[^0-9]/g, '')) 但这与我的期望相去甚远 两天在同一点

谢谢

【问题讨论】:

  • 它必须是一个正则表达式,或者你可以使用一个函数来做到这一点?
  • 您是否还需要删除领先的d

标签: javascript regexp-replace


【解决方案1】:

在您的示例中找到所有不需要的破折号的单个正则表达式只有在较新的 JS 引擎中才有可能,这些引擎实现了可变长度的 lookbehind 断言。这里是:

const text = "d333--4444-555--5---5-";
const re = /(?<=-+.+-+.+|-)-/g;
console.log(text.replace(re, ""));
// d333-4444-55555

匹配每个破折号

  • 在它之前的某处有两组连续的连字符,或者
  • 它前面的破折号

第二个条件将重复删除连续的破折号,在前两组破折号中只留下一个破折号;第一个条件将删除前两组之后的所有破折号。

如果您还想删除任何不是数字或破折号的字符,例如 Kosh 询问的前导 d,那么可以这样做:

const text = "d333--4444-555--5---5-";
const re = /(?<=-+.+-+.+|-)-|[^d-]/g;
console.log(text.replace(re, ""));
// 333-4444-55555

例如,Safari 仍然不支持 lookbehind 断言(还没有尝试过,信任caniuse.com),因此这可能不是一个合适的解决方案,具体取决于您的用例。如果您需要迎合此类浏览器,则需要使用更复杂的解决方案;单个正则表达式是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多