2013-11-27 35 views
3

是否有某种规则引擎或某种智能方式来执行此操作?智能解析字符串java

我有一个这样的字符串:

test 1-2-22 

,这样我可以得到这些值:

name = "test" 
part_id = 1 
brand_id = 2 
count = 22 

我有更多的这些所谓的规则,从中我知道字符串的格式。

我在想我可以用正则表达式来做到这一点,但有没有更好的方法来做到这一点?

编辑:

我看到一些非常好的答案。也许我应该更清楚。 这并不是说我有可能是唯一的字符串类型,我能有一个这样的字符串:

test 3-brand 15 – 2 

其中解析后,它应该是:

name = "test" 
part_id = 2 
brand_id = 3 
count = 15 

这样我就可以有不同的字符串和我需要为每个人制定规则/模式。什么是最好的方式来做到这一点?正则表达式是现在

+0

所有字符串都有这种格式吗? – Sionnach733

回答

3

一个选项,您可以使用下面的表达式两个空间和破折号围绕分裂:

[ -] 

然后你会从0开始索引找到不同的组件。

在Java:

String input = "test 1-2-22"; 
String[] results = input.split("[ -]"); 
2

您可以使用此Pattern regex

Pattern pattern = Pattern.compile("^([a-zA-Z]+)\\s*([^-]+)-([^-]+)-([^-]+)$"); 

那么这个代码应工作:

String line = "test 1-2-22"; 
Pattern pattern = Pattern.compile("^([a-zA-Z]+)\\s*([^-]+)-([^-]+)-([^-]+)$"); 
Matcher matcher = pattern.matcher(line); 
if (matcher.find()) { 
    System.out.printf("name:%s, part_id:%s, brand_id:%s, count:%s%n", 
     matcher.group(1), matcher.group(2), matcher.group(3), matcher.group(4)); 
} 
+0

我将如何使用您的模式与新的java 7命名组匹配JDL –

+0

@GandalfStormCrow:此代码应该与Java7“按原样”一起工作。 – anubhava

0

在这种特殊情况下,适当的split操作(或其他手动字符串处理)可能会变得最简单,因为你有明确的空白和破折号。

对于更为复杂的模式,你可以看看antlr为tokenising到这一点(例如)一个identifier和三个number令牌,然后解析它,但是这似乎是矫枉过正这里。 (这会给你一个“规则引擎”,thugh。)

一般:你可能想在解析上下文无关文法这个读了。

0

事情是这样的:

String s = "test 1-2-22"; 
String[] vars = s.split("[ -]"); 
String name = vars[0]; 
String part_id = vars[1]; 
String brand_id = vars[2]; 
String count = vars[3]; 

如果空间或这将拆分字符串 “ - ” 出现。 如果需要,您可以将ID转换为int。