2

我一次输入了"Varchar(10), Number(10), datetime(8), varchar(17),之类的输入char(3)

我只需要从中提取文本。我怎样才能在Java中做到这一点?

可以说我有 inputVarchar(50)并期待 output Varchar

我试过这个,但没有奏效:

String line = "varchar(0)";
String pattern = "\\D{.*}";
// Create a Pattern object 
Pattern r = Pattern.compile(pattern);
// Now create matcher object. 
Matcher m = r.matcher(line); 
if (m.find( )) { 
  System.out.println("Found value: " + m.group(0) ); 
} else { 
  System.out.println("NO MATCH"); 
} 
4

4 回答 4

2

您的组正则表达式一般

\w+\(\d+\)

并捕捉第一部分,你可以把它变成一个组

(\w+)\(\d+\)

试试这个功能:

private final Pattern TYPE_REGEX = Pattern.compile("(\\w+)\\(\\d+\\)");

public String extractType(String item) {
  Matcher matcher = TYPE_REGEX.matcher(item.trim());
  if(!matcher.matches())
    return null;
  return matcher.group(1);
}

赠品:

您也可以使用类型安全枚举作为返回类型,因为我认为您正在处理一组固定的数据库类型

private enum Type { VARCHAR, NUMBER, DATETIME, CHAR, ADD_ALL_OTHERS_THAT_APPLY }
private final Pattern TYPE_REGEX = Pattern.compile("(\\w+)\\(\\d+\\)");

public Type extractType(String item) {
  Matcher matcher = TYPE_REGEX.matcher(item.trim());
  if(!matcher.matches())
    return null;
  return Type.valueOf(matcher.group(1).toUpperCase());
}
于 2012-12-05T14:54:26.660 回答
0

如果您只处理单个外观,我认为正则表达式是矫枉过正的。

例如:

s = val.substring(1, val.indexOf ('('))

会做的工作。尽管这总是希望看到 '(' 作为输入字符串的一部分。

于 2012-12-05T14:51:13.867 回答
0

您可以使用此正则表达式拆分输入字符串"\\(\\d+\\),*"

示例代码:

String str = "Varchar(10), Number(10), datetime(8), varchar(17), char(3)";
String[] parts = str.split("\\(\\d+\\),*");

for (String part : parts)
    System.out.println(part.trim());

输出(注意trim()在打印元素之前调用。):

Varchar
Number
datetime
varchar
char
于 2012-12-05T14:53:42.417 回答
0
line.replaceAll("\\([^\\)]*\\)","");
于 2012-12-06T11:53:21.850 回答