Еще один вопрос регулярного выражения - PullRequest
0 голосов
/ 29 декабря 2010

Если у меня есть текст

<page a>The cat ran#$(*#(%)#over(*@#$the(*#%

и я использую сканер и метод useDelimiter, что регулярное выражение позволит мне извлечь:

<page a>
The
cat
ran
over
the

Пока я пробовал:

s.useDelimiter("[^a-zA-Z]|^(<.*>$)");

но это не оставляет угловые скобки нетронутыми, оно убирает их (очевидно, поскольку вместо этого оно соответствует a-zA-Z.

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Проблема не в разделителях, а в распознавании токенов. Ваши токены:

  • <page a>
  • The
  • cat
  • ran
  • over
  • the

Кодирование символов «<» в любом месте набора разделителей в значительной степени гарантирует, что они <em>не будут находиться в возвращаемых токенах. Если вы знаете, что <page a> находится где-то в начале строки (и я понимаю, что это может быть неверным предположением), вы можете сделать что-то вроде этого:

Scanner s = new Scanner(...);
s.useDelimiter("[^\\w]");
// Find an angle bracket token, if one is next.
String token = s.findInLine("<[^.]*>");
if (token != null)
    // process angle bracket token
token = s.next(); // get next delimited token
...

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

1 голос
/ 29 декабря 2010

Вы пробовали переключать обе опции?

s.useDelimiter("^(<.*>$)|[^a-zA-Z]");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...