有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从更大的字符串(重复字符)中提取子字符串

我有一系列的地址行格式:12345一些地址,一些正方形|电话号码|姓氏

例如:

40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith

76106 Tomas Highway, Santa Ana|722.884.5632|Roberts Westley 19056

Jamarcus Lane, Lawndale|(151)847-7455 x133|Haag Camille 66724 Slip

12-C, Hoover|841.047.3195 x69422|Trantow Danielle 99824 Fisher Locks

#247, Akron|(565)132-9970 x93939|Wiza Bell

我只想提取姓氏部分

我尝试了典型的str.substring(str.indexOf(“|”)和str.indexOf(”),但显然这会导致提取错误的字符串

关于如何从这些字符串中提取姓氏,有什么想法吗


共 (6) 个答案

  1. # 1 楼答案

    这是正则表达式的工作:

        Pattern rx = Pattern.compile("[^\\|]*\\|[^\\|]*\\|\\s*([^0-9]+)");
    
        String line = "76106 Tomas Highway, Santa Ana|722.884.5632|Roberts Westley 19056";
    
        Matcher m = rx.matcher(line);
        if(m.find()){
          String surname = m.group(1).trim();
          System.out.println(surname);
        }
    

    这将输出

    Roberts Westley
    
  2. # 2 楼答案

    我会用Regular Expressions来做这个

    代码:

    @Test
    public void test() {
      String[] lines
        = ("40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith\n" +
           "76106 Tomas Highway, Santa Ana|722.884.5632|Roberts Westley")
              .split("\n");
    
      Pattern pattern = Pattern.compile("^(?<address>.*?)\\|(?<number>.*?)\\|(?<surname>.*?) (?<name>.*?)$");
      for (String line : lines) {
        Matcher matcher = pattern.matcher(line);
        if(matcher.find()) {
          String surname = matcher.group("surname");
          System.out.println(surname);
        }
      }
    }
    

    输出:

    Sauer
    Roberts


    表达式与给定格式的一行匹配,然后可以轻松访问所需字符串的单个部分

    如果您希望将来访问不同的部件,这也更容易维护

  3. # 3 楼答案

    你可以用正则表达式来做这个

    ^.*\|([^\d]+)[^|]*$
    

    Demo

    代码

    System.out.println(s.replaceAll("^.*\\|([^\\d]+)[^|]*$", "$1"));
    

    输出

    Sauer Meredith                                                                                                                                                                  
    Roberts Westley                                                                                                                                                                 
    Haag Camille                                                                                                                                                                    
    Trantow Danielle                                                                                                                                                                
    Wiza Bell   
    

    完整代码:https://ideone.com/uON0BP

  4. # 4 楼答案

    试试这个。它只会给你一个姓氏

    String address = "40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith";
    System.out.println(address.substring(address.indexOf("|", address.indexOf("|") + 1) + 1, address.length()).split(" ")[0]);
    
  5. # 5 楼答案

    使用lastIndexOf方法

    This method returns the index of the last occurrence of the character in the character sequence represented by this object that is less than or equal to fromIndex, or -1 if the character does not occur before that point.

    例如:

    String data = "40327 Ocie Camp Apt. 117, Maywood|1-155-932-2562 x738|Sauer Meredith";
    System.out.println(data.substring(data.lastIndexOf('|') + 1));
    
  6. # 6 楼答案

    如果您的数据以某种形式定义为一致的,并且您始终具有如下数据结构:

    "12345 Some Address, Some Square|phone number|surname name"

    然后,您可以将每一行拆分为管道字符,并获得索引2处的元素

    String myString = "12345 Some Address, Some Square|phone number|surname name";
    String[] x = myString.split("\\|");
    System.out.println(x[2]);
    

    编辑:

    如果某些元素改变了顺序,这种方法将不起作用,如果某些元素丢失,这种方法将不起作用,因此您需要在验证输入之前注意这一点

    编辑2:

    另一种方法是获取管道的最后一个索引|,并使用字符串#子字符串()进行截断

    int c = myString.lastIndexOf("|");
    System.out.println(myString.substring(c + 1));