2017-04-05 70 views
3

我在格式一系列的地址线:12345某个地址,有些广场|电话号码|姓名从一个奇怪的大字符串中提取子串(重复字符)

例如:

40327 Ocie Camp Apt。 117,梅伍德| 1-155-932-2562 x738 |绍尔梅雷迪思

76106托马斯公路,圣安娜| 722.884.5632 |罗伯茨韦斯特利19056

贾马克斯里,朗代尔|(151)847-7455 x133 |哈格卡米尔66724滑

12-C,胡佛| 841.047.3195 x69422 | Trantow丹妮尔99824个费舍尔锁

#247,阿克伦城|(565)132-9970 x93939 | Wiza贝尔

我试图提取姓氏标准只有t。我试过典型的str.substring(str.indexOf(“|”),str.indexOf(“”)),但显然这导致错误的字符串被提取。

任何关于如何从这些字符串中获取姓氏的想法?

+0

有没有在所有的“怪异的字符串”多个姓? –

+2

编辑它 - 它们意味着分开的行。每行一个姓。 –

+0

这是一个分隔字符串,因此将字符串拆分为一个正确的单元格:'s.split(“|”)[2]'。那么,为了只获得姓氏,你不能因为姓氏可以有空间 – AxelH

回答

1

如果你的数据在你有ALLWAYS像一个数据结构的形式一致的定义:

“12345个某个地址,有些广场|电话号码|姓氏得名”

那么你可以拆分每一行到管炭和在索引得到元件2

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

编辑:

如果某些元素改变其顺序这种方法是行不通的,如果某些元素缺少这种做法是行不通的,所以你需要采取验证输入之前的照顾..

EDIT2:

另一种方法可以得到管道的最后一个索引|串#子()

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

您可以在split方法中使用int参数来强制结果的大小。这将至少防止出现较短String的情况下的OutOfBoundsException。我是否在评论中说过,这将返回姓氏名称,而不是姓氏,但是没有解决方案可以只接受姓氏而不会在接受的数据或分隔符上添加约束条件。 – AxelH

+1

这工作得很好。数据总是一致的,所以不用担心数据不好。如果我在其他地方乱搞,我可以使用他们的名字(姓氏+名字),所以这适用于我的目的。谢谢!这将是*好*只有姓,但全名也不错。 –

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

输出:

绍尔
罗伯茨


电子xpression按照您提供的格式匹配单行,然后您可以轻松访问所需字符串的单个部分。

如果您想在将来访问不同的零件,这也更容易维护。

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

你可以用正则表达式做到这一点。

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

Demo

代码

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

输出

Sauer Meredith                                         
Roberts Westley                                         
Haag Camille                                          
Trantow Danielle                                         
Wiza Bell 

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

0

这对正则表达式的工作:

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 
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]); 
相关问题