2014-05-09 394 views
0

提取浮動我有一個包含以下字符串數據正則表達式從字符串

... 
v -0.570000 -0.950000 -0.100000 
v 0.570000 -0.950000 -0.100000 
v -0.570000 -0.760000 -0.100000 
v 0.570000 -0.760000 -0.100000 
... 
f 34 22 
f 3 35 3 
f 345 22 
f 55 632 76 
f 55 632 
.... 

從這個文件我想提取所有從開始的「V」和「F」線的數字文件。我爲它編寫了以下正則表達式。

v(?:\s([0-9\-\.]+))+ 

Output: 
group 1: -0.100000 

f(?:\s([0-9]+))+ 

Output: 
group 1: 22 

但正如你可以看到輸出僅僅從每行提取的最後一個數字,我想輸出如下:

Output: 
group 1: -0.570000 
group 2: -0.950000 
group 3: -0.100000 

Output: 
group 1: 34 
group 2: 22 

是否有人可以幫助我在這裏?

+0

只做3個捕獲組而不是重複第一個。捕獲組保留最後一場比賽。 – Jerry

+0

是的,但數字可能不總是每行3。 – Suyash

+0

如何分裂? – Jerry

回答

0

這是我最後使用的解決方案,以防萬一有人需要它。

我使用了兩個正則表達式,而不是像上面的註釋中所建議的那樣使用字符串分割。

public class ObjParser { 
    private static final Pattern vertexLinePattern = Pattern.compile("^v\\s(.+)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
    private static final Pattern faceLinePattern = Pattern.compile("^f\\s(.+)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); 
    private static final Pattern vertexValuePattern = Pattern.compile("([0-9\\-\\.]+)"); 
    private static final Pattern faceValuePattern = Pattern.compile("([0-9]+)"); 

    private List<Float> vertices = new LinkedList<Float>(); 
    private List<Short> faces = new LinkedList<Short>(); 

    public void parseVertices(String data) { 
     Matcher matcher1 = vertexLinePattern.matcher(data); 
     while(matcher1.find()) { 
      String line = matcher1.group(1); 

      Matcher matcher2 = vertexValuePattern.matcher(line); 
      while(matcher2.find()) { 
       vertices.add(Float.parseFloat(matcher2.group(1))); 
      } 
     } 
    } 

    public void parseFaces(String data) { 
     Matcher matcher1 = faceLinePattern.matcher(data); 
     while(matcher1.find()) { 
      String line = matcher1.group(1); 

      Matcher matcher2 = faceValuePattern.matcher(line); 
      while(matcher2.find()) { 
       short no = (short)(Integer.parseInt(matcher2.group(1)) - 1); // -1 due to 1 based index in OBJ files 
       faces.add(no); 
      } 
     } 
    } 

    public List<Float> getVertices() { 
     return vertices; 
    } 

    public List<Short> getFaces() { 
     return faces; 
    } 
}