Как найти тот же шаблон в строке, а затем перенести их в массив в Java? - PullRequest
0 голосов
/ 15 октября 2010

Например,

Строка: "{{aaa, bbb}, {ccc, ddd}, {eee, fff}}"

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

Шаблон: {{...}, {...}, {...}}

Что такое регулярное выражение сопоставления с образцом?

Ответы [ 3 ]

1 голос
/ 15 октября 2010

Не уверен, что вы хотите, поэтому здесь идет:

Вариант 1a

Будет возвращено String[] содержащее элементы:

[ "aaa,bbb",
  "ccc,ddd",
  "eee,fff" ]

если вы вызываете это с вашей исходной строкой:

  public static String[] split1(String source) {
    final ArrayList<String> res = new ArrayList<String>();

    if (source != null) {
      source = source.trim();
      if (source.startsWith("{") && source.endsWith("}")) {
        final Pattern p = Pattern.compile("\\{([^}]+)\\}[,]?");
        final Matcher m = p.matcher(source.substring(1).substring(0, source.length() - 2));

        while (m.find()) {
          res.add(m.group(1));
        }
      }
    }
    return (res.toArray(new String[res.size()]));
  }

Вариант 1b

РЕДАКТИРОВАТЬ: это немного проще, чем 1а, для того же результата:

public static String[] split3(final String source) {
  final ArrayList<String> res = new ArrayList<String>();

  if (source != null) {
    final Pattern p = Pattern.compile("\\{(([^{}]+)[,]?)+\\}");
    final Matcher m = p.matcher(source.trim());

    while (m.find()) {
      res.add(m.group(2));
    }
  }
  return (res.toArray(new String[res.size()]));
}

Вариант 2a

Это вернет String[][] содержащие элементы:

[ [ "aaa", "bbb" ],
  [ "ccc", "ddd" ],
  [ "eee", "fff" ] ]

если вы вызываете это со своей исходной строкой:

  public static String[][] split2(String source) {
    final ArrayList<String[]> res = new ArrayList<String[]>();

    if (source != null) {
      source = source.trim();
      if (source.startsWith("{") && source.endsWith("}")) {
        final Pattern p = Pattern.compile("\\{([^}]+)\\}[,]?");
        final Matcher m = p.matcher(source.substring(1).substring(0,
            source.length() - 2));

        while (m.find()) {
          res.add(m.group(1).split(","));
        }
      }
    }
    return (res.toArray(new String[res.size()][]));
  }

Вариант 2b

РЕДАКТИРОВАТЬ: это немного проще, чем 2а, для того же результата:

public static String[][] split4(final String source) {
  final ArrayList<String[]> res = new ArrayList<String[]>();

  if (source != null) {
    final Pattern p = Pattern.compile("\\{(((\\w+),(\\w+))[,]?)+\\}");
    final Matcher m = p.matcher(source.trim());

    while (m.find()) {
      res.add(new String[] {
          m.group(3),
          m.group(4)
      });
    }
  }
  return (res.toArray(new String[res.size()][]));
}

Вот основной метод тестирования:

public static void main(String[] args) {
  final String TEST = "{{aaa,bbb},{ccc,ddd},{eee,fff}}";

  System.out.println("split1 (Option 1a)");
  for (final String str : split1(TEST)) {
    System.out.println(str);
  }

  System.out.println("split2 (Option 2a)");
  for (final String[] strs : split2(TEST)) {
    System.out.println(Arrays.toString(strs));
  }

  System.out.println("split3 (Option 1b)");
  for (final String str : split3(TEST)) {
    System.out.println(str);
  }

  System.out.println("split4 (Option 2b)");
  for (final String[] strs : split4(TEST)) {
    System.out.println(Arrays.toString(strs));
  }
}
0 голосов
/ 15 октября 2010

String имеет метод split(String regex), который может оказаться полезным.Возвращает String[].

Вы выяснили шаблон;

Шаблон: {{...}, {...}, {...}}

там есть повторяющаяся тема, которая разделяет элементы массива, которые вы пытаетесь извлечь.Вы также можете подумать о том, как обрабатывать начальные и конечные биты в шаблоне, которые вам не нужны.

0 голосов
/ 15 октября 2010

Под ред. Вот лучшее решение. Вы просто создадите скомпилированный шаблон один раз, а затем запустите его для каждой входной строки с помощью процедуры matcher ().

    Matcher m= Pattern.compile( "\\{(\\w*,\\w*)\\}" ).matcher( "{{aaa,bbb},{ccc,ddd},{eee,fff}}" );
    List<String> stuffArray = new ArrayList<String>();
    for ( int i = 1; m.find(); i++ )
    {
        stuffArray.add( m.group().replaceAll( "[{}]","" ) );
    }
    String[] stuffString = stuffArray.toArray( new String[ stuffArray.size() ] );
...