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

dz6r00yl  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(304)

我需要解析一个包含整数的文件,格式如下例所示(用于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个整数,我需要改进以捕获该字符串中的所有整数。

svgewumm

svgewumm1#

你可以用一个 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);
}

数据.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]
ds97pgxw

ds97pgxw2#

为运行上述要求而实施的测试

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

        }
    }

}
nvbavucw

nvbavucw3#

这可能相当简单。
循环遍历与此正则表达式匹配的文件。
每次采集第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

相关问题