编写正则表达式来捕获有符号整数

时间:2015-01-14 22:47:19

标签: java regex matcher

我需要解析一个包含格式为此示例的整数的文件(用于对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用于分隔这些数字

任何人都可以使用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个整数,我需要改进以捕获该字符串中的所有整数。

3 个答案:

答案 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]

答案 1 :(得分: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() + " -- ");

        }
    }

}

答案 2 :(得分: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