2017-02-15 5 views
2

У меня есть строка формы "Some lengthy string, Pattern1: string1, Pattern2: string2, Pattern3: string3". Моя цель состоит в том, чтобы извлечь string1, string2 и string3 из таких String.Сплит-строка нескольких шаблонов

Отметьте, что сами Strings, Pattern1, Pattern2 и Pattern3 состоят из нескольких символов. Я знаю решение, если эти шаблоны были одиночными. В настоящее время я вынужден делать несколько звонков String.split() по одному для Pattern1, Pattern2 и Pattern3.

Есть ли более изящный способ сделать это? Или нет экранирования нескольких звонков split()?

EDIT: Я искал или использовал конкретное решение (поэтому Java был в заголовке, но он был отредактирован). Так или иначе. Это то, что я пробовал, и, похоже, это работает для меня.

String someString = "Some lengthy string Pattern1: string1 Pattern2: string2 Pattern3: string3"; 
String [] str = someString.split("Pattern1:|Pattern2:|Pattern3:"); 
System.out.println(str[1]); 
System.out.println(str[2]); 
System.out.println(str[3]); 

Выход этого

string1 
string2 
string3 

Любые очевидные проблемы с этим?

+5

Захват группы могут помочь: [ 'Pattern1 (s): (. *) \ С *, \ S * Pattern2: \ s * (. *?), \ s * Pattern3: \ s * (. *) "'] (https://regex101.com/r/LA4cts/2) –

ответ

0

Как насчет String.replaceAll() вместо этого с группами захвата?

str.replaceAll(".*(?:Pattern1: ([^,]*))(?:, Pattern2: ([^,]*))(?:, Pattern3: ([^,]*))", "$1;$2;$3").split(";"); 

или сделать еще короче, вы можете удалить шаблоны и просто искать двоеточие:

str.replaceAll("[^:]*: ([^,]*,?)", "$1").split(","); 
+0

Мне это нравится, но подумайте об изменении его на: '. .., "$ 1; $ 2; $ 3"). Split (";") 'для получения массива вместо onecontinuousstring – Bohemian

+0

Изменено. Спасибо! – Uniphonic

1

Чтобы получить массив из ваших целей, вы должны сначала содрать ведущую роль, затем разделить на других моделей:

String targets = input.replaceAll("^.*?Pattern1: ", "").split(", (Pattern2|Pattern3): "); 
0

строка stringToSearch = "Некоторые длительные строки Pattern1: string1 Pattern2: строка2 Pattern3: string3";

String REGEX = "Pattern\\w:\\s[\\w]+"; 
Pattern p1 = Pattern.compile(REGEX); 
Matcher m = p1.matcher(stringToSearch); 

Pattern p2 = Pattern.compile(":"); 

while (m.find()) 
{ 
    String[] items = p2.split(m.group()); 
    if(items.length < 2) 
     break; 
    System.out.println(items[1]); 
} 

Выход:

STRING1 строка2 string3

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