2016-12-15 4 views
3

У меня есть строка, которая выглядит ниже.Как извлечь шаблон ниже из строки?

{(firstName1,lastName1,College1,{(24,25)},{(Street,23)},City1,Country1)} 

Мне нужно извлечь детали/значения из приведенного выше и добавить их в список. Под деталями я имею в виду:

["firstName1","lastName1","College1","24","25","Street","23","City1", "country1"] 

Как я могу достичь вышеуказанного? Я попробовал метод ниже, но не уверен, как получить все фигурные скобки и скобки в шаблон.

private static String flattenPigBag(String pigdata) { 
    String s = ""; 
    Pattern p = Pattern.compile("\\{(.*)}"); 
    Matcher m = p.matcher(pigdata); 
    while (m.find()) { 
     s = m.group(1); 
     System.out.println("answer : " + s); 
    } 
    return s; 
} 
+0

Каков ожидаемый выход? – Thrasher

+0

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

+0

@Thrasher Я отредактировал вопрос. Пожалуйста, посмотрите еще раз – mayooran

ответ

5

Попробуйте это:

String[] parts = str.replaceAll("}|\\{", "").split(","); 
+0

В ожидаемом выходе OP вместо 'запятой 'дал' и'. Я не знаю, как это работает. – GurV

+0

@gur Я думаю, что OP просто использовал английский, а не фактический выход. – Bohemian

+0

: D OP отредактировал его только сейчас. – GurV

3

Вы вынуждены использовать шаблон? Если нет, не стесняйтесь использовать это.

private static List<String> flattenPigBag(String s) { 
    return Arrays.asList(s.replaceAll("[(){}]", "").split(",")); 
} 

Выход:

[firstName1, lastName1, College1, 24, 25, Street, 23, City1, Country1] 
1

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

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexMatchingWithNamedCaptureGroup { 

    public static void main(String[] args) { 
     String regex = "\\{(\\(" 
       + "(?<firstName>[^,]*)" 
       + ",(?<lastName>[^,]*)" 
       + ",(?<college>[^,]*)" 
       + ",\\{\\(" 
       + "(?<num1>\\d*)" 
       + ",(?<num2>\\d*)\\)\\}" 
       + ",\\{\\((?<street>[^,]*)" 
       + ",(?<streetNum>\\d*)\\)\\}" 
       + ",(?<city>[^,]*)" 
       + ",(?<country>[^,]*)" 
       + "\\))\\}"; 
     String input 
     = "{(firstName1,lastName1,College1,{(24,25)},{(Street,23)},City1,Country1)}"; 
     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(input); 
     if (m.find()) { 
      String firstName = m.group("firstName"); 
      String lastName  = m.group("lastName"); 
      String college  = m.group("college"); 
      String num1   = m.group("num1"); 
      String num2   = m.group("num2"); 
      String street  = m.group("street"); 
      String streetNum = m.group("streetNum"); 
      String city   = m.group("city"); 
      String country  = m.group("country"); 
      System.out.println(firstName 
           + "," + lastName 
           + "," + college 
           + "," + num1 
           + "," + num2 
           + "," + street 
           + "," + streetNum 
           + "," + city 
           + "," + country 
           ); 
     } else { 
      System.err.println("Does not match!"); 
     } 

    } 

} 

Выход этого программа такова:

firstName1,lastName1,College1,24,25,Street,23,City1,Country1 
+0

Это регулярное выражение, мои глаза! –

+0

Спасибо, что указали это. Я обновил свое регулярное выражение, чтобы использовать группу named-capture, чтобы сделать код более удобным для чтения и обслуживания. – leeyuiwah