2013-08-31 2 views
-1

Я понимаю, что такой кодразделительная строка с пробелом и несколькими другими знаками операции?

tokens = mystring.split(\\s); 

будет разделить строку, основываясь на пробельных (или несколько пробелов) и вернуться и массив с лексем между пространствами. Тем не менее, у меня возникли проблемы с пониманием того, как один из этих параметров используется для функции split. Как указать несколько разделителей?

В частности, я хотел бы разделить строку и разделить его со следующими разделителями:

  • -
  • +
  • *
  • /
  • #
  • _ (это подчеркивание)
  • ^(это морковь)

Да, если вам интересно, я пытаюсь реализовать постфиксный калькулятор, используя стек. Но дело не в этом ... Дело в том, что мне трудно понять, как вы придумываете параметры для метода split. Есть ли там большие ресурсы, которые объясняют это?

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

+0

Что вы имеете в виду, указав несколько разделителей? Не могли бы вы привести пример 'String' и как вы хотели бы разбить его? –

ответ

0

Сначала вам нужно понять регулярное выражение. Для базового использования это очень просто :) Для вашего требования вы можете разделить его на String[] split = mystr.split("[-+*/#_^]");. Квадратные скобки содержат список символов для соответствия, если любой из символов в этой квадратной скобке соответствует, то это соответствует.

+0

Не могли бы вы объяснить, почему вы использовали квадратные скобки? – user2734823

+0

Теперь, когда вы спросили об этом, я также обнаружил, что существует избыточность :) квадратные скобки предусматривают 'any of' (список), поэтому нет необходимости в канале. Обновлен ответ. –

+0

У меня есть еще один вопрос, если вы не возражаете ... как бы я объединил функциональность String [] split = mystr.split ("[- + */# _ ^]"); и что-то вроде String [] split = mystr.split ("\\ s"); в одну строку? – user2734823

1

Ну, как вы, вероятно, читали в других ответах, метод split принимает значение regex, означающее, что переданный String будет интерпретироваться иначе, чем обычная последовательность символов. Некоторые из ваших желаемых разделителей известны как метасимволы, что означает, что вам нужно избежать их, поставив \\ раньше.

Например, предположим, что вы имели следующую строку:

String string = "this+is+a+string";

И вы хотите, чтобы разбить строку с помощью + знаков. Учитывая, учитывая, что + является мета характер, вы должны избавиться от нее:

String[] split = string.split("\\+");

И значения будут:

split[0] = "this" 
split[1] = "is" 
split[2] = "a" 
split[3] = "string" 

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

+0

Это объяснение было очень простым, и это имеет большой смысл. Откуда вы знаете, является ли персонаж метасимволом? Является ли это общеизвестным или это то, что я могу ссылаться в некоторых онлайн-ресурсах/ресурсах? – user2734823

+0

@ user2734823 Ну, вы можете посмотреть [это] (http://www.hscripts.com/tutorials/regular-expression/metacharacter-list.php) в качестве ссылки; он перечисляет все метасимволы. –

1

Глядя на странице документации Java для Pattern, кажется, что вы можете использовать это регулярное выражение для фильтрации любой пунктуации:

\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~ 

Ниже приведен пример кода, который я побежал, чтобы проверить это:

public static void main(String[] args) { 

    String[] vars = "a+b#c_d^e/f*g-h".split("\\p{Punct}"); 

    for (String var : vars) { 
     System.out.println(var); 
    } 
} 

с выходом:

a 
b 
c 
d 
e 
f 
g 
h 

Так расщепленного Punc (или пустым просто использовать .split("\\s|\\p{Punct}"); Это потому, что символ трубы | обозначает или в регулярном выражении. Если у вас есть какие-либо вопросы о моем ответе, не стесняйтесь комментировать ниже, и я отредактирую.

0

Вам не нужны сложные регулярные выражения для синтаксического анализа простых математических выражений. StringTokenizer достаточно для разбора таких выражений. Поскольку вы собираетесь делать постфиксный калькулятор, вы, вероятно, захотите игнорировать пустое пространство и вернуть обратно всех операторов, таких как *, + и так далее.

Вот функция split

public static List<String> split(String line, String delim, boolean includeDelim, boolean removeWhiteSpace) { 
    List<String> tokens = new ArrayList<String>(); 
    StringTokenizer parser = new StringTokenizer(line, delim, includeDelim); 

    while (parser.hasMoreTokens()) { 
     String token = parser.nextToken(); 
     if (removeWhiteSpace) { 
      token = token.replaceAll("\\s+", ""); 
     } 
     tokens.add(token); 
    } 

    return tokens; 
} 

Выше функция позволяет указать, хотите ли вы все разделители назад или часть между ними разделители. Вы можете также игнорировать пустое пространство.

А вот моя главная функция

public static void main(String aa[]) { 
    final String DELIM = "+-*/^#_"; 
    Scanner in = new Scanner(System.in); 

    while (true) { 
     String line = in.nextLine(); 
     System.out.println(">" + split(line, DELIM, true, true)); 
    } 
} 

Некоторые образцы выход

12^36 - 15 + 17 
>[12, ^, 36, -, 15, +, 17] 

500*6/3+2 
>[500, *, 6, /, 3, +, 2] 

Я получаю все эти разделители обратно. Вы можете манипулировать списком, возвращаемым функцией split.

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