Как я могу найти все "((" и заменить их на "("? - PullRequest
1 голос
/ 09 июля 2019

Мне дана строка, и я хочу заменить все открытые скобки, которые встречаются подряд, на одну

  • ((5))(5)
  • ((((5))))(5)

Я попытался

str = str.replaceAll("((", "(");

и получил ошибку регулярного выражения, затем я попытался

str = str.replaceAll("\\((", "(");

, затем я попытался

str = str.replaceAll("\\\\((", "(");

Я получаю ту же ошибку!

Ответы [ 4 ]

4 голосов
/ 09 июля 2019

вы пробовали это?

str = str.replaceAll("\\({2,}", "(");

'\' - это escape-символ, поэтому каждый специальный символ должен следовать за ним. Без них регулярное выражение читает его как открытые скобки, используемые для группировки, и ожидает закрытые скобки.

Редактировать: Первоначально я думал, что он пытается точно соответствовать 2

1 голос
/ 09 июля 2019

Предполагая, что скобки не нужно соединять, например, ((((5)) должно стать (5), тогда будет делать следующее:

str = str.replaceAll("([()])\\1+", "$1");

Тест

for (String str : new String[] { "(5)", "((5))", "((((5))))", "((((5))" }) {
    str = str.replaceAll("([()])\\1+", "$1");
    System.out.println(str);
}

Выход

(5)
(5)
(5)
(5)

Объяснение

(         Start capture group
  [()]      Match a '(' or a ')'. In a character class, '(' and ')'
            has no special meaning, so they don't need to be escaped
)         End capture group, i.e. capture the matched '(' or ')'
\1+       Match 1 or more of the text from capture group #1. As a
          Java string literal, the `\` was escaped (doubled)
$1        Replace with the text from capture group #1

См. Также regex101.com для демонстрации.

1 голос
/ 09 июля 2019

Вам необходимо экранировать все скобки и добавлять + для учета последовательных вхождений:

str = str.replaceAll("\\(\\(+","(");
0 голосов
/ 09 июля 2019

Я не уверен, являются ли скобки фиксированными или динамическими, но предполагая, что они могут быть динамическими, вы можете использовать replaceAll, а затем String.Format для форматирования строки.

Надеюсь, это поможет

public class HelloWorld{

 public static void main(String []args){

    String str = "((((5))))";
    String abc = str.replaceAll("\\(", "").replaceAll("\\)","");
    abc =  String.format("(%s)", abc);
    System.out.println(abc);

 }
}

Выход: (5)

Я пробовал приведенный выше код с ((5)) и (((5))), и он выдает тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...