Извлечение текста из двух разных типов символов с использованием регулярного выражения

98
6

Я пытаюсь извлечь строки из текста, который содержит два разных типа символов. Символы | и # и текст поступает из внешнего источника.

Я приведу вам пример:

    Вход: #hello|#what|whatsup| должен hello| и whatsup. Вход: #hello# должен hello Вход: |ola|1 должен вернуть ola Вход: |hello#|what#whatsup#node должен вернуть hello# и whatsup

спросил(а) 2012-05-26T18:15:00+04:00 8 лет, 5 месяцев назад
1
Решение
91

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

     String s1 = "#hello|#what|whatsup|";
String s2 = "#hello#";
String s3 = "|ola|1";
String s4 = "|hello#|what#whatsup#node";

Pattern pattern = Pattern.compile("((\\w)+)(\\||#)(\\||#)?");
Matcher matcher = pattern.matcher(s4);
while(matcher.find()) {
System.out.println(matcher.group(1) + (matcher.group(4) != null ? matcher.group(4).equals("|")? "#" : "|" : ""));
matcher.find(); //to jump over the next match
}

Обновление: я просто прочитал пример middlerecursion. Я не боюсь, но я должен оставить свой компьютер на некоторое время. Так что это всего лишь кое-что, чтобы вы начали.

Обновить версию, которая работает для всех примеров:

     String s1 = "#hello|#what|whatsup|";
String s2 = "#hello#";
String s3 = "|ola|1";
String s4 = "|hello#|what#whatsup#node";
String s5 = "#||##||MiddleRecursion||##||#";

Pattern pattern = Pattern.compile("(#|\\|)((#|\\|)*\\w+(#|\\|)*)(#|\\|)");
Matcher matcher = pattern.matcher(s1);
while(matcher.find()) {
System.out.println(matcher.group(2));
}

ответил(а) 2012-05-26T19:09:00+04:00 8 лет, 5 месяцев назад
41

Хорошо, я начну.

Таким образом, вам нужно сопоставить # something # или | something |

Можете ли вы написать два отдельных регулярных выражения, которые это делают?


Прежде всего, вы будете раздражены тем, что труба | является магическим символом в регулярном выражении. Если вы хотите совпадение с этим символом, вам нужно будет префикс его \\ в соответствии с другим связанным мной потоком.

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

(Я уезжаю в течение нескольких часов...)

ответил(а) 2012-05-26T18:35:00+04:00 8 лет, 5 месяцев назад
42

Поскольку #||##||MiddleRecursion||##||#||##||MiddleRecursion||##|| , Боюсь, вам нужно выполнить скобки. В этом случае не будет общего решения с использованием регулярного выражения (вы можете заставить его работать, если знаете максимальный последовательный внешний вид | и #). Причина в том, что существует средняя рекурсия; регулярное выражение может разрешать только левую или правую рекурсию.

Это также одна из причин, почему синтаксический анализ HTML невозможен с помощью регулярного выражения.

ответил(а) 2012-05-26T18:30:00+04:00 8 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема