从奇怪的较大字符串中提取子字符串(重复字符)

时间:2017-04-05 08:02:53

标签: java string

我有一系列格式的地址行:12345 Some Address,Some Square |电话号码|姓氏

例如:

  

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 个答案:

答案 0 :(得分:1)

如果您的数据是以一种形式定义的,那么您必须具有以下数据结构:

  

" 12345一些地址,一些广场|电话号码|姓氏和#34;

然后你可以将每一行拆分为管道char并获取索引为2的元素

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

编辑:

如果某些元素改变了它的顺序,这种方法不会起作用,如果缺少某些元素,这种方法就无法工作,所以你需要注意那个验证输入之前......

EDIT2:

另一种方法是获取管道的最后一个索引 | 并使用 String #substring()

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

答案 1 :(得分:1)

您可以使用正则表达式执行此操作。

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

Demo

<强>代码

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

<强>输出

Sauer Meredith                                                                                                                                                                  
Roberts Westley                                                                                                                                                                 
Haag Camille                                                                                                                                                                    
Trantow Danielle                                                                                                                                                                
Wiza Bell   

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

答案 2 :(得分:0)

我会使用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);
    }
  }
}

<强>输出:

  

绍尔
  罗伯茨

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

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

答案 3 :(得分:0)

使用lastIndexOf方法

  

此方法返回此对象表示的字符序列中最后一次出现的索引,该索引小于或等于fromIndex,如果该字符在该点之前未出现,则返回-1。

示例:

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

答案 4 :(得分:0)

这是正则表达式的工作:

reg [15:0] SIGNAL_i;
reg [15:0] SIGNAL_ii;
reg [15:0] SIGNAL_noise_i;
reg [15:0] SIGNAL_noise_reg; //za hranjenje zasumljenega signala
int RANDOM_noise_i; 
int COUNT_end;
int COUNT;

initial SIGNAL_i=1;
initial COUNT_end=0;
initial COUNT=3'd4; 
initial SIGNAL_ii=0;
initial SIGNAL_noise_i=1;
initial SIGNAL_noise_reg=0;
initial RANDOM_noise_i=1;

initial CLK = 1;

always #5 CLK = ~CLK;

always #10      
begin
SIGNAL_noise_reg <= SIGNAL_noise_i;
RANDOM_noise_i = $signed($urandom_range(0,2))-1;  //random noise generation

//upcount
if ((SIGNAL_i<16'd30766) && (SIGNAL_ii<SIGNAL_i)) //32765
  begin
      begin
        if (COUNT_end==COUNT)
          begin
            assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);  
            SIGNAL_i=SIGNAL_i + 1;
            SIGNAL_ii=SIGNAL_ii + 1;
            COUNT_end=0;
            COUNT_end=0;
          end
        else
          begin
            assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);  
            COUNT_end= COUNT_end + 1;
          end
      end
  end


//counter on zero  
else if (SIGNAL_i == 0)
  begin
    SIGNAL_i = 1;
    SIGNAL_ii = 0;
    SIGNAL_noise_i = SIGNAL_i + RANDOM_noise_i; 
  end

//down count  
   else
      begin
        if (COUNT_end==COUNT)
          begin
            assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);  
            SIGNAL_i=SIGNAL_i - 1;
            SIGNAL_ii=SIGNAL_ii + 1;
            COUNT_end=0;
            COUNT_end=0;
          end
        else
          begin
            assign SIGNAL_noise_i=SIGNAL_i + (RANDOM_noise_i);  
            COUNT_end= COUNT_end + 1;
          end
      end
  end
end

这将输出

    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);
    }

答案 5 :(得分:0)

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

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]);