2015-11-12 1 views
0

У меня есть несколько строк, и ожидаемый результат после манипуляций со строками,Выкрутить парные скобки ({},(), []) и текст в ней и заменить оставшиеся непарные с пространством в строке в Java

Строка аб = (abc) def -> def // возвращает строку после удаления парных скобок и текста внутри нее.

Строка кд = а (DEF. -> а Защита // заменить непарные скобки с пробелами

Строка эф = ABCDEF) -> ABCDEF // заменить непарные скобки с пробелами.

String gh = (abc) def (xyz) -> def // возвращает строку после удаления парных скобок и текста внутри нее.

String ij = ((abc) def (xyz)) -> empty // возвращает пустую строку в виде парных скобок, а текст внутри них удаляется.

Строка ке = (ABC) Защита (хуг (ABC) -..> Защита хуга // удаляет парные скобки и текст внутри и возвращают остальные

мне нужно сделать следующую строку манипуляцию на строку при условии

Для парных скобок(), {}, [] скобки и текст внутри них должны быть удалены, а непарные должны быть заменены пробелом. Я пробовал со многими регулярными выражениями и установочным счетчиком. Но не было работая как ожидалось.

Любые идеи? Спасибо заранее.

+0

«Я пробовал со многими регулярными выражениями и счетчиком настроек». Опубликовать то, что вы пробовали .. –

+0

str = str.replaceAll ("\\ (. *? \\)?", ""); , str.replaceAll ("\\ (. * \\)", ""); – user2563239

+0

См. Http://stackoverflow.com/questions/8116924/use-a-stack-to-check-txt-file-for-s-s-s-etc-java для начала. Я не уверен, что вы хотите делать с такими случаями, как '[a (cd] ef), хотя – nhahtdh

ответ

0
  1. использовать стек, чтобы подтолкнуть символы
  2. при нажатии закрывающей скобки затем выскочить до начала кронштейна
  3. в конце всех символов поп до начала кронштейна и нажать пространство повторить, пока стек пусто.
+0

может объяснить вам пример. – user2563239

1

Вы не можете решить эту задачу с помощью одного регулярного выражения в java, поскольку рекурсивное регулярное выражение не поддерживается в java (хотя они находятся в perl).

Правильный способ решения этой задачи - следовать решению Karthik Jeganathan - например, создайте простой код для синтаксического анализа строки.

Хотя вы можете комбинировать регулярное выражение с циклом while, чтобы решить эту проблему. Я должен предупредить вас, что это будет ужасно неэффективно. Вот код:

int previousInputLength = 0; 
String input; 
while(input.length() != previousInputLength) { 
    previousInputLength = input.length(); 
    input = input.replaceAll("\\([^()]*\\)", ""); 
} 
input = input.replace("(", " ").replace(")", " "); 
Смежные вопросы