我在第一时间输入了"Varchar(10)
,Number(10)
,datetime(8)
,varchar(17)
,char(3)
。
我只需从中提取文字。我怎么能用Java做到这一点?
假设我输入Varchar(50)
并期望输出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");
}
答案 0 :(得分: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());
}
答案 1 :(得分:0)
如果你只处理单一的外表,我认为正则表达式是过度的。
例如:
s = val.substring(1, val.indexOf ('('))
会做这个工作。虽然这总是希望看到'('作为输入字符串的一部分。
答案 2 :(得分: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
答案 3 :(得分:0)
line.replaceAll("\\([^\\)]*\\)","");