2015-03-22 3 views
0

Я уже задавал аналогичный вопрос раньше, но я хотел бы знать, существует ли регулярное выражение для синтаксического анализа строки, так что число и строки извлекаются, игнорируя все знаки пунктуации, но допускающие один апостроф для каждого слово, будь то в начале или конце.Трейлинг и предшествующие апострофы

String problem = "'Cause I''m lo#[email protected]' t%o ext!r$act a^ll 8 su*bs(tr]i{ngs."; 

String[] solve = {"'Cause", "I'm", "lookin'", "to", "extract", "all", "8", "substrings"}; 

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

Обратите внимание, что I'm содержит только один апостроф, даже с двумя между ними.

+0

Покажите нам регулярное выражение, которое вы использовали. – m0skit0

+0

Я использовал один [здесь] (http://stackoverflow.com/questions/28709754/specific-regex-pattern), предложенный Avinash, но он не обрабатывает апострофы, как ожидалось. –

ответ

0

Вы можете попробовать регулярное выражение, которое будет раздеться все символы и знаки препинания без одиночных апострофа:

[\p{S}\p{P}&&[^']]+

Результат: 'Cause I''m lookin' to extract all 8 substrings

Вы тогда должны заменить двойные одиночные апострофы с .replaceAll, а затем так же, как и в предыдущем ответе.

Вот код:

String s = "I'm lo#[email protected] t%o ext!r$act a^ll 6 su*bs(tr]i{ngs."; 
    String parts[] = s.replaceAll("[\\p{S}\\p{P}&&[^']]+", "").replaceAll("[']{2}", "'").split("\\s+"); 
    for (int i=0; i<parts.length; i++) 
     System.out.println(parts[i]); 

Результат:

I'm                                         
looking                                        
to                                         
extract                                        
all                                         
6                                         
substrings 
1

одной функции replaceAll и функция разделения будет достаточно для этого.

String problem = "'Cause I''m lo#[email protected]' t%o ext!r$act a^ll 8 su*bs(tr]i{ngs."; 
System.out.println(Arrays.toString(problem.replaceAll("(?!')\\p{P}|\\p{S}|(')+","$1").split("\\s+"))); 

Выход:

['Cause, I'm, lookin', to, extract, all, 8, substrings] 

ИЛИ

String problem = "'Cause I''m lo#[email protected]' t%o ext!r$act a^ll 8 su*bs(tr]i{ngs."; 
System.out.println(Arrays.toString(problem.replaceAll("[^\\w\\s']|(')+","$1").split("\\s+")));