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

Writing a regular expression to capture signed integers

我需要解析一个包含格式为本例整数的文件(用于基准 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

我想捕获这些数字中的每一个。

和 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 个整数,我需要改进以捕获该字符串中的所有整数。

您可以使用 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]

这可能相当简单。

遍历匹配此正则表达式的文件。
每次取capture group 1的内容and
按空格拆分(使用 "\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  

针对运行 以上要求实施的测试

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() + " -- ");

        }
    }

}