需要帮助正则表达式

时间:2012-12-05 14:46:44

标签: java regex

我在第一时间输入了"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"); 
} 

4 个答案:

答案 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("\\([^\\)]*\\)","");