2013-11-27 33 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。