用括号拆分字符串

时间:2018-05-28 14:03:49

标签: java regex

我有一个遵循这种模式的String列表:

'Name with space (field1_field2) CONST'

示例:

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

我想提取:

  • 带空格的名称
  • 括号内的值
  • 括号后的CONST值

对于括号中的字符串()我正在使用:

\(.*\)

不确定其他字段

3 个答案:

答案 0 :(得分:2)

您可以使用

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

请参阅regex demo

模式详情

  • \\s* - 0+ whitespaces
  • [()] - )(
  • \\s* - 0+ whitespaces

如果您的字符串始终采用指定的格式(没有括号,(...),没有括号),您将拥有:

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 +字符
  • \\( - (
  • ([^()]*) - 捕获第2组:除()以外的任何0 +字符
  • \\) - )
  • (.*) - 捕获第3组:尽可能多的0个字符,直至行尾(如果您需要限制([^()]*)和{{,请使用( 1}}在这一部分也是如此。
  • ) - 字符串结尾(隐含在$

答案 1 :(得分:1)

使用以下内容: -

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);
}

答案 2 :(得分:1)

该表达式将生成3组:

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

第一组将匹配名称,第二组将匹配括号内的值,第三组将匹配常量。