2015-11-20 3 views
-1

Я хочу написать небольшой алгоритм.Как получить следующий токен из строки?

Я столкнулся следующие проблемы: У меня есть String, который может содержать цифры и следующие символы: -, (, ). Я хочу разобрать его, поэтому я могу получить каждый символ и номер.

Метод, который я хочу написать, (getNextToken) должен возвращать символы и числа успешно. Например: getNextToken("(123-456)-12-1") должен возвращать:

  • по первому зову: "("
  • на второй вызов: "123"
  • на третий вызов: "-"

и так далее.

Проблема, с которой я сталкиваюсь, заключается в том, что каждая числовая часть может содержать несколько цифр.

Я понимаю, что писать такую ​​функцию не стоит, но это не «примитивная» функция. Итак, есть ли у Java класс utilit для решения этой проблемы?

+2

Я не уверен, что я понимаю ваш вопрос. Пример может помочь. –

+0

@ Mukul Goe добавил пример к теме – gstackoverflow

+0

Я думаю, что regEx может решить вашу проблему поиска. Может быть, поделиться своим кодом? – JFPicard

ответ

3

Еще регулярные выражения решения с тем же выходом, как JohnTeixeira's answer:

String input = "(123-456)-12-1"; 
Pattern pattern = Pattern.compile("([()-]|\\d+)"); 
Matcher matcher = pattern.matcher(input); 

while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

И это не использовать «не рекомендуется» StringTokenizer класс. Вы можете найти точные данные этого регулярного выражения here.

5

java.util.StringTokenizer можно назвать включать разделители в токенов

String str = "(123-456)-12-1"; 
StringTokenizer tokenizer = new StringTokenizer(str,"-()",true); 
while (tokenizer.hasMoreTokens()) { 
    System.out.println(tokenizer.nextToken()); 
} 

возвращается

(
123  
- 
456 
) 
- 
12 
- 
1 

Является ли это то, что вы хотели?

+0

Что относительно http://stackoverflow.com/a/6983908/2674303? – gstackoverflow

+0

Это нормально, но вы получите неожиданные результаты. Например, что произойдет, если вы добавите некоторые пробелы в исходную строку ввода? – markspace

+0

Если вы хотите использовать косу, это можно сделать с помощью 'String [] result = str.split (" ((? <= -) | (? = -)) | ((? <= \\)) | (? = \\))) | ((? <= \\() | (? = \\()) "),' который является менее читаемым для меня, но может иметь более длительный срок службы, они осуждают токенизатор. –

1

Я не уверен, что это то, что вы ищете, и это не совсем понятно. Это проблема с регулярными выражениями: \

String str = "(123-456)-12-1"; 
String splittedStr = Arrays.toString(str.split("((?<=-)|(?=-)|(?<=[(])|(?=[(])|(?<=[)])|(?=[)]))")); 
System.out.println(splittedStr); 
// Outputs: [(, 123, -, 456,), -, 12, -, 1] 

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

String str = "(123-456)-12-1"; 
String splittedStr = Arrays.toString(str.split("((?<=-|[(]|[)])|(?=-|[(]|[)]))")); 
System.out.println(splittedStr); 
// Output: [(, 123, -, 456,), -, 12, -, 1] 
+0

Я думаю, что это объясняет некоторые проблемы с этим регулярным выражением, которое вы использовали: http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/ – markspace

Смежные вопросы