2014-05-09 9 views
0

У меня есть файл, который содержит следующие строки данныхRegex для извлечения поплавка из строки

... 
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

Вот решение, которое я использовал, наконец, на случай, если кому-то это понадобится.

Я использовал два Regex вместо использования разделения строк, как это предлагается в приведенных выше комментариях.

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; 
    } 
} 
Смежные вопросы