2017-04-05 89 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]); 
相關問題