Если мы интерпретируем «удалить второй набор скобок» как означающее, что если два набора строк, заключенных в скобки, являются последовательными, удалите второй набор, мы можем написать его так:
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
На английском языке оно соответствует двум наборам текста в скобках, необязательно разделенных пробелами, и сохраняет первый набор.