Взгляд в будущее и группа - PullRequest
2 голосов
/ 21 мая 2010

В Java, для текста, подобного foo <on> bar </on> thing <on> again</on> now, я бы хотел получить регулярное выражение с группами, которые дают мне поиск "foo", "bar", пустую строку, затем "вещь", "снова", "сейчас" .

Если я сделаю (.*?)<on>(.*?)</on>(?!<on>), я получу только две группы ( foo bar, снова вещь , и у меня нет конца "сейчас").

если я сделаю (.*?)<on>(.*?)</on>((?!<on>)) я получу foo bar пустую строку , тогда вещь снова и пустая строка (здесь я должен хотеть "сейчас").

Пожалуйста, какова магическая формула?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 21 мая 2010

Если вы настаиваете на этом с помощью регулярных выражений, тогда вы можете попробовать использовать \s*<[^>]*>\s* в качестве разделителя:

    String text = "foo <on> bar </on> thing <on> again</on> now";
    String[] parts = text.split("\\s*<[^>]*>\\s*");
    System.out.println(java.util.Arrays.toString(parts));
    // "[foo, bar, thing, again, now]"

Я не уверен, что это именно то, что вам нужно, потому что это не совсем понятно.


Возможно, что-то подобное требовалось:

    String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10";
    String[] parts = text.split("\\s*</?on>\\s*|<[^>]*>[^>]*>");
    System.out.println(java.util.Arrays.toString(parts));
    // prints "[1, 2, 3, 5, 7, 8, , 10]"

Это не обрабатывает вложенные теги. Если они у вас есть, вы бы действительно хотели сбросить регулярное выражение и использовать реальный анализатор HTML.

Если вам не нужна пустая строка в середине массива, просто (?:delimiter)+.

    String text = "1<on>2</on>3<X>4</X>5<X>6</X>7<on>8</on><X>9</X>10";
    String[] parts = text.split("(?:\\s*</?on>\\s*|<[^>]*>[^>]*>)+");
    System.out.println(java.util.Arrays.toString(parts));
    // prints "[1, 2, 3, 5, 7, 8, 10]"
0 голосов
/ 21 мая 2010

Мои рекомендации

  • нет необходимости сопоставлять текст до <on> и после </on>
  • использовать не жадные флаги для сопоставления текста между <on> и следующим </on>
  • используйте цикл с Matcher.find() для последовательного прохождения всех случаев, если это возможно. Не нужно делать все сразу с одним большим жирным регулярным выражением!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...