我有一个遵循这种模式的String列表:
'Name with space (field1_field2) CONST'
示例:
'flow gavage(ZAB_B2_COCUM) BS'
'flowWithoutSpace (WitoutUnderscore) BS'
我想提取:
对于括号中的字符串()我正在使用:
\(.*\)
不确定其他字段
答案 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()
一起使用,则可以省略^
和$
,因为该方法需要完整的字符串匹配。
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*?(.*)
第一组将匹配名称,第二组将匹配括号内的值,第三组将匹配常量。