2015-01-14 3 views
2

Мне нужно разобрать файл, содержащий целые числа, отформатированные как в этом примере (для тестирования алгоритма DPLL):Дать регулярное выражение, чтобы захватить целые числа

-486 535 0 
-563 745 0 
125 -430 512 -4 512 -4 0 
512 -4 0 
667 -19 0 
40 -281 512 -4 0 
-231 637 0 

В целом данные отформатированы как то

number number number 0 
numbers are separated by space and each line ends with the character 0, 

, например это может быть строка, которую я хочу разобрать

545 -565 7 55 0 

Я хочу захватить каждый номер.

  • 545 будет первый
  • -565 второго
  • 7 третьих
  • 55 четвертого

и 0 для separatting этих цифр

Кто-нибудь может дать мне регулярное выражение, чтобы сделать это с помощью java?

код я использую это:

    Pattern pattern = Pattern.compile("(\\-?\\d*)\\s*(\\-?\\d*)\\s*(\\-?\\d*)\\s*0"); 
       Matcher matcher = pattern.matcher(sCurrentLine); 
       //System.out.print("hou find one"); 
       if (matcher.find()) { 
        int id; 
        boolean val; 
        int i=1; 
        Clause tempClause = new Clause(counter); 
        do 
        { 
         id = Integer.parseInt(matcher.group(i)); 
         val = id>0; 
         if (val == false)id*=-1; 
         tempClause.addLiteral(new Literal (id,val)); 

         System.out.print("id "+id+" the current i:"+i+".\n"); 
         i++; 
        } 
        while (i<3); 
       this.clauses.add(tempClause); 
       counter++; 
       System.out.print("the i:"+i+"\n"); 
       } 

С помощью этого кода я захватить 3 целых числа, мне нужно улучшить, чтобы захватить все целые числа в этой строке.

+0

Требуется ли использовать регулярное выражение? – haley

+3

Регулярное выражение так же просто, как '-? \ D +'. –

+0

Я отредактировал сообщение, чтобы показать вам код, который я использую –

ответ

3

Вы можете сделать это с помощью Scanner:

public static void main(String[] arguments) throws FileNotFoundException { 
    Scanner scanner = new Scanner(new File("data.txt")); 
    List<Integer> integers = new ArrayList<Integer>(); 
    while (scanner.hasNext()) { 
     int i = scanner.nextInt(); 
     if (i != 0) 
      integers.add(i); 
    } 
    System.out.println(integers); 
} 

data.txt

-486 535 0 
-563 745 0 
125 -430 512 -4 512 -40 
512 -4 0 
667 -19 0 
40 -281 512 -4 0 
-231 637 0 

Выход

[-486, 535, -563, 745, 125, -430, 512, -4, 512, -40, 512, -4, 667, -19, 40, -281, 512, -4, -231, 637] 
+0

Мне нужно получить целые числа каждой строки, символ 0 находится в конце строки. –

+0

@DavidWallace, да, я забыл об отрицательных числах :) –

+0

Спасибо, что за вашу помощь, я ценю: D. –

0

Это может быть довольно просто.

Петля через файл, соответствующий этому регулярному выражению.
Приемное содержимое захвата 1-й группы, каждый раз и
разделенного на пробельных символов (с использованием "\\s+")

# "(?s)\\s*(.+?)\\s+0\\b" 

(?s) 
\s* 
(.+?)      # (1) 
\s+ 0 \b 

Выход:

** Grp 0 - (pos 0 , len 10) 
-486 535 0 
** Grp 1 - (pos 0 , len 8) 
-486 535 
---------------- 
** Grp 0 - (pos 10 , len 12) 

-563 745 0 
** Grp 1 - (pos 12 , len 8) 
-563 745 
---------------- 
** Grp 0 - (pos 22 , len 35) 

125 -430 512 -4 512 -40 
512 -4 0 
** Grp 1 - (pos 24 , len 31) 
125 -430 512 -4 512 -40 
512 -4 
---------------- 
** Grp 0 - (pos 57 , len 11) 

667 -19 0 
** Grp 1 - (pos 59 , len 7) 
667 -19 
---------------- 
** Grp 0 - (pos 68 , len 18) 

40 -281 512 -4 0 
** Grp 1 - (pos 70 , len 14) 
40 -281 512 -4 
---------------- 
** Grp 0 - (pos 86 , len 12) 

-231 637 0 
** Grp 1 - (pos 88 , len 8) 
-231 637 
2

Тест реализован для запуска выше требований

import org.junit.Test; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class testRegex { 


    @Test 
    public void testIntRegex() { 

     Pattern intsOnly = Pattern.compile("(-?\\d+)"); 

     String example = "545 -565 7 55 0"; 

     Matcher matcher = intsOnly.matcher(example); 
     while (matcher.find()) { 
      System.out.println(matcher.group() + " -- "); 

     } 
    } 

} 
+0

Да, OP не кажется ясным, если любой из них может быть встроен между альфа-символами. Если да, то ваш путь - это путь. +1 – sln

Смежные вопросы