【问题标题】:Regex to replace all non numbers but allow a '+' prefix正则表达式替换所有非数字,但允许使用“+”前缀
【发布时间】:2021-03-04 07:23:01
【问题描述】:

我想从代表电话号码的字符串中删除所有无效字母。只允许使用“+”前缀和数字。 我在 Kotlin 中尝试过

"+1234abc567+".replace("[^+0-9]".toRegex(), "")

它几乎完美无缺,但它不能取代最后一个“+”。 如何修改正则表达式以仅允许第一个“+”?

【问题讨论】:

    标签: regex kotlin


    【解决方案1】:

    您可以对以下模式进行正则表达式替换:

    (?<=.)\+|[^0-9+]+
    

    示例脚本:

    String input = "+1234abc567+";
    String output = input.replaceAll("(?<=.)\\+|[^0-9+]+", "");
    System.out.println(input);   // +1234abc567+
    System.out.println(output);  // +1234567
    

    下面是正则表达式模式的解释:

    (?<=.)\+  match a literal + which is NOT first (i.e. preceded by >= 1 character)
    |         OR
    [^0-9+]+  match one or more non digit characters, excluding +
    

    【讨论】:

    • 在我的代码中工作就像一个魅力,谢谢。
    • 如果我们可以在其中使用 \d 而不是 0-9 看起来会更短:)。尽管如此,还是很好的解决方案
    • @SandeepGusain 出于各种原因,我更喜欢将0-9 放入字符类而不是\d,因为它可以让字符类更易于阅读恕我直言。
    • @SandeepGusain 这可以写得更短,见my answer
    【解决方案2】:

    你可以使用

    ^(\+)|\D+
    

    替换为对第一组 $1 的反向引用。请参阅regex demo

    详情

    • ^(\+) - 捕获到第 1 组的字符串开头的 +
    • | - 或
    • \D+ - 一个或多个非数字字符。

    注意:以""" 分隔的原始字符串文字允许使用单个反斜杠来形成正则表达式转义,例如\D\d 等。使用这种类型的字符串文字极大地简化了代码中的正则表达式定义。

    Kotlin demo

    val s = "+1234abc567+"
    val regex = """^(\+)|\D+""".toRegex()
    println(s.replace(regex, "$1"))
    // => +1234567
    

    【讨论】:

    • @SandeepGusain 我提到$1 是对第一组的反向引用,即第1 组。\+ 用括号括起来,形成capturing group。要在替换模式中使用该值,请使用 $+组 ID。编号以1 开头(因为$0 是对整个匹配值的反向引用)。
    • 非常有趣的解决方案。我总是对正则表达式的力量感到震惊;)
    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 2016-06-28
    相关资源
    最近更新 更多