【问题标题】:how to format string line that contains numbers with regex如何使用正则表达式格式化包含数字的字符串行
【发布时间】:2017-02-16 12:10:34
【问题描述】:

我想按以下格式格式化电话号码:

  • 359878123456
  • 0878123456
  • 00359878123456

放置在包含以下格式的姓名和电话号码信息的文件中:

  • DarkoT 00359878123456

以标准格式格式化,仅用于数字(忽略名称)。见下文:

  • 达科T +359 87 2 123456

这适用于所有情况。

这就是我所在的位置。(我的正则表达式)

        System.out.println(String.valueOf(inputLine).replaceAll("((\\+|00)359|0)(\\-|\\s)?8[7-9][2-9](\\-|\\s)?\\d{3}(\\s|\\-)?\\d{3}$", "($1)-\\$"));

我对展示位置感到困惑。请指教。

【问题讨论】:

  • 您必须捕获数字,而不是分隔符。
  • 试试.replaceAll("^((?:\\+|00)?359|0)[-\\s]?(8[7-9][2-9])[-\\s]?(\\d{3})[-\\s]?(\\d{3})$", "$1 $2 $3 $4").replaceFirst("^00", "+")。见this Java demo
  • 另请注意,您的意思可能是DarkoT +359

标签: java regex


【解决方案1】:

1 没有正则表达式的解决方案:您可以只拆分字符串并将其从后面分组。但是,我真的更喜欢使用正则表达式,所以我开始了:

我想你必须有这种格式(如果这不正确,这将不起作用):

  1. [可选] 00(长度:2)
  2. [可选] 111(始终考虑 3 个数字)(长度:3)
  3. 如果您没有前者:0(更改区域,我明白吗?)(长度:1)
  4. 22(长度:2)
  5. 3(长度:1)
  6. 444444(长度:6)

现在正则表达式来捕捉这个:

(?:(?:00)?(\d{3})|0)(\d{2})(\d{1})(\d{6})

因此,您将拥有:

  • 第 1 组:3 位数字(国家代码?)或没有(如果是“0”)。
  • 第 2 组:2 位数字(区域?)
  • 第 3 组:1 位数(不知道,在我的国家我们不使用这个)
  • 第 4 组:最后 6 位数字

使用替换有一些限制,所以我会使用匹配器,很简单:

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(originalNumber);
if (m.find()) {
    String nationalCode = m.group(1) != null ? m.group(1) : DEFAULT_NATIONAL_CODE;
    formattedNumber = "+" + nationalCode + " " + m.group(2) + " " + m.group(3) + " " + m.group(4);
}

如果您想要更大的灵活性(例如,国家/地区编号为 2 位,而不仅仅是 3 位)请告诉我,我会更改正则表达式。

注意:我没有对此进行测试,只是在我的脑海中编写了代码,如果失败请告诉我。

【讨论】:

    【解决方案2】:

    我认为这是你之前问题How to check exact phone number in Java with regex的延续

    Sample.java

    import java.util.*;
    import java.util.regex.*;
    import java.io.*;
    public class Sample{
    public static void main(String[] args){
        try{
              File inFile = new File ("phonebook.txt");
    
              Scanner sc = new Scanner (inFile);
              while (sc.hasNextLine())
              {
                String line = sc.nextLine();
                if(line.matches("^((.)*\\s)?((\\+|00)359|0)8[7-9][2-9]\\d{6}$")) // here that code doesn't work
                {
                System.out.println (line.replaceAll("^([^\\s\\+]*\\s?)?((\\+|00)?359|0)[-\\s]?(8[7-9][2-9])[-\\s]?(\\d{3})[-\\s]?(\\d{3})$", "$1 - $2 $4 $5 $6").replaceAll("00359","+359").replaceAll("- 0","+359"));
                }
              }
              sc.close();
    }catch(Exception e){}
            }
    }
    

    phonebook.txt

    Sagar +359883123456
    Test 00359883123565
    Someone 0883123456
    People 1234567890
    Test1 +359873123456
    

    输出

    C:\Users\acer\Desktop\Java\programs>javac Sample.java
    
    C:\Users\acer\Desktop\Java\programs>java Sample
    Sagar  - +359 883 123 456
    Test  - +359 883 123 565
    Someone  +359 883 123 456
    Test1  - +359 873 123 456
    

    【讨论】:

    • 您的 java 代码不是您将它放在 run script 标记中的 jave-script* 跨度>
    猜你喜欢
    • 2018-12-20
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多