заменить подстроку сопоставленного регулярного выражения - PullRequest
6 голосов
/ 26 мая 2011

Я извлекаю html и выполняю некоторые манипуляции со строками, и получаю строку вроде

string sample = "\n    \n   2 \n      \n  \ndl. \n \n    \n flour\n\n     \n 4   \n    \n cups of    \n\nsugar\n"

Я хотел бы найти все строки ингредиентов и удалить пробелы и разрывы строк

2 дл.мука и 4 чашки сахара

Пока мой подход заключается в следующем.

Pattern p = Pattern.compile("[\\d]+[\\s\\w\\.]+");
Matcher m = p.matcher(Result);

while(m.find()) {
  // This is where i need help to remove those pesky whitespaces
}

Ответы [ 6 ]

4 голосов
/ 26 мая 2011

sample = sample.replaceAll("[\\n ]+", " ").trim();

Выход:

2 dl. flour 4 cups of sugar

Без пробелов в начале и без пробелов в конце.

Сначала он заменяет все пробелы и символы новой строки одним пробелом, а затем обрезает лишние пробелы в начале / конце.

3 голосов
/ 27 мая 2011

Следующий код должен работать для вас:

String sample = "\n    \n   2 \n      \n  \ndl. \n \n    \n flour\n\n     \n 4   \n    \n cups of    \n\nsugar\n";
Pattern p = Pattern.compile("(\\s+)");
Matcher m = p.matcher(sample);
sb = new StringBuffer();
while(m.find())
    m.appendReplacement(sb, " ");
m.appendTail(sb);
System.out.println("Final: [" + sb.toString().trim() + ']');

ВЫХОД

Final: [2 dl. flour 4 cups of sugar]
1 голос
/ 27 мая 2011

Я предположил, что \n не фактический перевод строки, но он также работает с linefeeds. Это должно работать нормально:

test=test.replaceAll ("(?:\\s|\\\n)+"," ");

Если нет textual \n, это может быть проще:

test=test.replaceAll ("\\s+"," ");

Вам нужно обрезать начальные / конечные пробелы.

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

1 голос
/ 26 мая 2011

Я думаю, что-то подобное будет работать для вас:

String test = "\n    \n   2 \n      \n  \ndl. \n \n    \n flour\n\n     \n 4   \n    \n cups of    \n\nsugar\n";

/* convert all sequences of whitespace into a single space, and trim the ends */
test = test.replaceAll("\\s+", " ");
0 голосов
/ 26 мая 2011
s/^\s+//s
s/\s+$//s
s/(\s+)/ /s

Запустите эти три замены (заменив начальные пробелы ничем, замените пробелы пустыми, замените несколько пробелов пробелом.

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

Вы должны быть в состоянии использовать стандарт String.replaceAll (String, String) .Первый параметр примет ваш шаблон, второй - пустую строку.

...