Сложное извлечение строки в Java - PullRequest
2 голосов
/ 30 апреля 2011

Я работаю с библиотекой diff в java, которая выводит diff с квадратными скобками вокруг них, где существует несколько diff-файлов одного типа, и без квадратных скобок для diff, где существует только один diff.

Примеркратный diff это «Diff (4, L3, L4, L5, L6, 119LNS], [)» и «Diff (2, R43, R46, 51k], [2, R44, R47, 10k], [2, R45,R48, 1k], [) ".Примерами одиночных различий являются «Diff (PBSS306NZ, 135)» и «Diff (4, L3, L4, L5, L6, 119LNS], [)».

Я хочу извлечь различия изтакие строки, как «4, L3, L4, L5, L6, 119LNS» вместо «Diff (4, L3, L4, L5, L6, 119LNS], [)», и я рассмотрел некоторые из вопросов, которые здесь пытаютсясделать что-то подобное, но регулярное выражение в этих вопросах не делает то, что мне нужно.Я пробовал "\ [[^ \]] \]" и "\ [. ? \] +", Но они не работают.Мы будем благодарны за любую помощь от экспертов по регулярным выражениям.

Я загрузил образец выходного файла на https://rapidshare.com/#!download|869l36|460197924|regextest.txt|1

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

Я считаю, что это делает то, что вы ищете:

File file = new File("regextest.txt");
StringBuilder sb = new StringBuilder();
Scanner scanner = new Scanner(file).useDelimiter("\n");
while (scanner.hasNext()) {
    String line = scanner.next();
    line = line.replaceAll("^Diff\\(", "");
    line = line.replaceAll("\\)$", "");
    sb.append(line);
}
String combined = sb.toString();

Pattern pattern = Pattern.compile("\\[.+?\\]");
Matcher matcher = pattern.matcher(combined);
while (matcher.find()) {
    String extract = combined.substring(matcher.start(), matcher.end());
    extract = extract.replaceAll("\\[ ?", "");
    extract = extract.replaceAll(" ?\\]", "");
    System.out.println(extract);
}

Для вашего regextest.txt файла вывод выглядит так:

12, C1,C4,C5,C6,C9,C10,C15,C18,C19,C20,C23,C24, C0603, 10nF
10, C2,C3,C7,C8,C13,C16,C17,C21,C22,C27, C0603, 100nF
2, C11,C25, SMT, 1uF LOW ESR 50V
4, C12,C14,C26,C28, C0805, 2u2
4, D1,D2,D4,D9, SOT23, BAS40-04/SOT
4, D3,D5,D6,D7, SMB, SMBJ5.0A
1, D8, SMB, SMBJ15A
2, D10,D11, SMB, SMBJ30A
1, J1, SMT, CON12
2, L1,L2, SMT, 744043471, 470uH
4, L3,L4,L5,L6, 119LNS
...
1 голос
/ 30 апреля 2011

Bernard,

Я полагаю, что в нем могут быть несколько указателей, которые, я полагаю, помогут вам выбрать правильный путь.

package forums;

public class RegexTest2
{
  public static void main(String[] args) {
    try {
      final String expected = "4, L3,L4,L5,L6, 119LNS";
      String actual = "Diff(4, L3,L4,L5,L6, 119LNS ], [ )"
        .replaceAll("^Diff\\(( \\], \\[ )?", "")
        .replaceAll("[\\[\\], )]*$", "");
      assert expected.equals(actual) : actual;
      //System.out.println("Correct result: "+actual);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Ага, тут много догадок ... потому что я на самом деле не знаю, ЧТО вы хотите сопоставить ... и, возможно, что еще более важно: все, что вы хотите НЕ соответствовать.

Приветствия. Кит.


РЕДАКТИРОВАТЬ: Теперь, когда я думаю об этом, мы используем бомбу, где будет делать молот ... То есть: мы пытаемся использовать REGEX (шаблон общего назначения ) matcher) когда все, что ДЕЙСТВИТЕЛЬНО нам нужно, это просто «удалить все и все из этих символов из начала и конца строки. Конечно,« пользовательский »метод будет более чистым подходом, даже если он немного больше кода.

0 голосов
/ 02 мая 2011

Bernard,

Относительно вашего дополнительного вопроса в комментарии к самому прекрасному ответу WhiteFang34.

www.regular-expressions.info

http://www.regular -expressions.info / - самый официальный веб-ресурс на планете. Они охватывают ВСЕ вещи регулярного выражения, с правильными, доступными объяснениями подробных примеров ...

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

Также: Оформить заказ там, в разделе Инструменты: у них есть интерактивный тестер регулярных выражений. ИСПОЛЬЗУЙТЕ ЕГО в любое время, когда вам необходимо разработать регулярное регулярное выражение. Подумайте, "IDE для Regex's". Это волшебство (ИМХО). И я только что обнаружил там автоматический генератор регулярных выражений, который, кажется, даже работает.

Во всяком случае, сайт является отправной точкой, просто для ясности объяснений.

Приветствия. Кит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...