Расщепление строки с круглыми скобками - PullRequest
0 голосов
/ 28 мая 2018

У меня есть список строк, который следует этому шаблону:

'Name with space (field1_field2) CONST'

Пример:

'flow gavage(ZAB_B2_COCUM) BS'    
'flowWithoutSpace (WitoutUnderscore) BS'

Я хотел бы извлечь:

  • Имяс пробелом
  • Значения в скобках
  • Значение CONST после скобок

Для строки внутри скобок () я использую:

\(.*\)

Не уверен насчет других полей

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Используйте следующее: -

String line = "'Name with space (field1_field2) CONST'";
Pattern pattern = Pattern.compile("([A-Za-z\\s]+)\\((.*)\\)(.*)\\'");
Matcher matcher = pattern.matcher(line);
String nameWithSpace = "";
String fieldsValuesInBrackets = "";
String constantValue = "";

if (matcher.find()) {
    nameWithSpace = matcher.group(1);
    fieldsValuesInBrackets = matcher.group(2);
    constantValue =  matcher.group(3);
}
0 голосов
/ 28 мая 2018

Это выражение сгенерирует 3 группы:

(.*?)(\(.*?\))\s*?(.*)

Первая группа будет соответствовать имени, вторая - значениям в квадратных скобках, третья - константе.

0 голосов
/ 28 мая 2018

Вы можете использовать

String[] results = s.split("\\s*[()]\\s*");

См. Демоверсию regex

Детали шаблона

  • \\s* - 0+ пробелов
  • [()] - ) или (
  • \\s* - 0+ пробелов

Если ваши строки всегдав указанном формате (без скобок, (...), без скобок) у вас будет:

Name with space                      = results[0]
The values inside the brackets       = results[1]
The CONST value after the brackets   = results[2]

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

Pattern.compile("^([^()]*)\\(([^()]*)\\)(.*)$")

См. regex demo

Если вы используете его с Matcher#matches(), вы можете опустить ^ и $, так как этот метод требует полного совпадения строки.

Java demo :

String regex = "^([^()]*)\\(([^()]*)\\)(.*)$";
String s = "flow gavage(ZAB_B2_COCUM) BS";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
    System.out.println(matcher.group(1).trim()); 
    System.out.println(matcher.group(2).trim()); 
    System.out.println(matcher.group(3).trim()); 
} 

Здесь шаблон означает:

  • ^ - начало строки (неявно в .matches())
  • ([^()]*) - Группа захвата 1: любые 0+ символов, кроме ( и )
  • \\( - a (
  • ([^()]*) - Захватгруппа 2: любые 0+ символов, кроме ( и )
  • \\) - a )
  • (.*) - Captuгруппа звонков 3: любые 0+ символов, как можно больше, до конца строки (используйте ([^()]*), если вам нужно ограничить ( и ) в этой части тоже).
  • $ - конец строки (неявный в .matches())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...