2015-03-22 4 views
0

Я пытаюсь очистить это очень Шумный (из-за ОРЗ) набора данных имен и адресов электронной почты и одна проблема заключается несколько имен в одной записи, напримерСплит Строки в Java

"Fenner, Robert: Fishbume, Howard" should be "Fenner, Robert" and "Fishbume, Howard" 

or "Fendrich, Karen N., Ricci, Vincent" should be "Fendrich, Karen N." and "Ricci, Vincent" 

Как я мог использовать регулярное выражение для поиска записей, где строки разделены запятой или двоеточием, которые сами разделяются запятой, а затем разделяют строку?

другие варианты этой проблемы:

"'Emily Phaup ' Ryan, Thomas M" -> "Emily Phaup", "Ryan, Thomas M" 

"A Lilly, Alisia Rudd, Andrew McComb, Daniel Lisbon, David Compton" 
->"A Lilly", "Alisia Rudd", "Andrew McComb", "Daniel Lisbon", "David Compton" 

"Abigail.Perlmangus.pm.com [email protected]" -> "Abigail.Perlmangus.pm.com", "[email protected]" 

и несколько больше.

Я знаю, что это не может быть возможно отделить все эти вхождения (особенно без случайного sepperating правильных имен), но разделяя некоторые из них, безусловно, помогут

EDIT: Я думаю, мой вопрос немного слишком широк, поэтому я немного сужу его:
Есть ли способ найти строки с форматом "string1,string2, string3,string4" (строки могут содержать любые символы и пробелы) и разделить их на две отдельные строки: "string1,string2" and "string3,string4"?
и может кто-нибудь дать мне несколько указателей на то, как это сделать, потому что я довольно неопытен с регулярным выражением.

+2

Неясно, что вы просите. Просьба представить четкие примеры возможных сценариев и попытаться опубликовать ваши попытки. – Maroun

+0

Вы должны не только публиковать свой ввод, но и ожидаемый результат! Так что ты хочешь. – isnot2bad

ответ

0

Моя честная рекомендация - взять образец представителя в онлайн-калькулятор Regex и поиграть с ним, пока вы не сможете вставить результат.

Как вы уже отметили, вход не достаточно регулярный, чтобы действительно использовать регулярное выражение. Но вы, возможно, сможете немного взломать его. Вероятно, это не будет идеальным ответом на эту гадость.

+0

хорошо, я попробую это. Получил какие-либо советы о том, как найти что-то в этом формате: '" string1, string2, string3, string4 "'? –

0

Невозможно автоматически очистить вывод OCR. Используя регулярное выражение, вы никогда не узнаете, соответствует ли вам требуемый символ в ожидаемом контексте. Выход OCR должен быть очищен вручную.

+0

Я знаю, но есть много записей, поэтому, по крайней мере, чистка некоторых из этих ошибок автоматически будет отличной –

1

Ну я бы попробовать, что-то вроде

public static void main(String[] args) throws URISyntaxException, IOException { 

    String regex = "(\\w+(,|:|$)\\s*\\w+)(,|:|$)"; 
    Pattern pattern = Pattern.compile(regex); 

    String [] tests = { 
      "Fenner, Robert: Fishbume, Howard" 
      ,"string1, string2, string3, string4" 
    }; 

    for (String test : tests) { 
     Matcher matcher = pattern.matcher(test); 
     while(matcher.find()){ 
      System.out.println(matcher.group(1)); 
     } 

    } 
} 

Выхода:

Fenner, Robert 
Fishbume, Howard 
string1, string2 
string3, string4 

Это не будет работать для всех случаев, но ответить на ваше последнее редактирование


Что я сделал, ищет любые слова-символы (\ w +), за которыми следует либо, или: или находится в конце строки. Далее следуют пробелы и другие слова, за которыми следуют, или: или конец строки.


Regex подробно

(\w+(,|:|$)\s*\w+)(,|:|$) 
1st Capturing group (\w+(,|:|$)\s*\w+) 
    \w+ match any word character [a-zA-Z0-9_] 
     Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy] 
2nd Capturing group (,|:|$) 
    1st Alternative: , 
     , matches the character , literally 
    2nd Alternative: : 
     : matches the character : literally 
    3rd Alternative: $ 
     $ assert position at end of the string 
\s* match any white space character [\r\n\t\f ] 
    Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy] 
\w+ match any word character [a-zA-Z0-9_] 
    Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy] 
3rd Capturing group (,|:|$) 
    1st Alternative: , 
     , matches the character , literally 
    2nd Alternative: : 
     : matches the character : literally 
    3rd Alternative: $ 
     $ assert position at end of the string 
+0

спасибо, не могли бы вы объяснить регулярное выражение, пожалуйста? –

+0

Ответа на этот вопрос отредактировал для пояснения regex – Vyncent

Смежные вопросы