Regex: удалите вторую пару парантезов в Java - PullRequest
0 голосов
/ 08 июня 2019

Я хотел бы удалить второй набор скобок в строке.Предпочтительно с этим Java-методом: replaceAll ()

до сих пор я пытался:

  1. return device.replaceAll("(\w+\s*\w*)","");
    , который выдает ошибку: unexpected char \

  2. return device.replaceAll("[()]","").trim();
    , который удаляет все скобки и завершающие пробелы

Вот мой метод:

private static String parseDeviceDescription(String device) {
    device = device.replaceAll("apply discount","");
    return device.replaceAll("(\w+\s*\w*)","");
}

ЗдесьВот как я называю метод:

String device = parseDeviceDescription("device name (2018) (apply discount)");
System.out.println("The device description is: " + device);

Ожидаемые результаты:

"device name (2018)"

Ответы [ 4 ]

1 голос
/ 08 июня 2019

Если мы интерпретируем «удалить второй набор скобок» как означающее, что если два набора строк, заключенных в скобки, являются последовательными, удалите второй набор, мы можем написать его так:

private static String parseDeviceDescription(String device) {
    return device.replaceAll("(\\([^()]*\\))\\s*\\([^()]*\\)", "$1");
}

Тест

String[] devices = {
        "device name (2018) (apply discount)",
        "a b (c)",
        "a b (c) (d) (e)",
        "a (b) c (d) (e) f (g) (h)",
        "a (b) (c) (d) (e) (f) (g) (h)"
};
for (String device : devices)
    System.out.println(parseDeviceDescription(device));

Выход

device name (2018)
a b (c)
a b (c) (e)
a (b) c (d) f (g)
a (b) (d) (f) (h)

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

Объяснено

(              Start capture group #1
  \([^()]*\)     Match `(text)` where `text` cannot contain parenthesis
)              End capture group #1
\s*            Match white-spaces, if any
\([^()]*\)     Match `(text)` where `text` cannot contain parenthesis

$1             Insert test from capture group #1

На английском языке оно соответствует двум наборам текста в скобках, необязательно разделенных пробелами, и сохраняет первый набор.

0 голосов
/ 08 июня 2019

Я предполагаю, что мы хотим удалить (apply discount), что мы можем использовать это простое жадное выражение:

(.*)(\s+\(.*)

и замените его группой захвата # 1

Демо

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(.*)(\\s+\\(.*)";
final String string = "device name (2018) (apply discount)";
final String subst = "\\1";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);
0 голосов
/ 08 июня 2019

заменить все после первого ) (включительно) на )

"device name (2018) (apply discount)".replaceAll("\\).*",")")
0 голосов
/ 08 июня 2019

Вы можете использовать метод .substring().

Сначала получите индекс вашей первой закрывающей скобки ')' с device.indexOf(")")

Затем передайте это методу substring(), примерно так:

    return device.substring(0,device.indexOf(")"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...