编写正则表达式以捕获有符号整数
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
我想捕获这些数字中的每一个。
- 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 个整数,我需要改进以捕获该字符串中的所有整数。
您可以使用 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() + " -- ");
}
}
}
我需要解析一个包含格式为本例整数的文件(用于基准 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 个整数,我需要改进以捕获该字符串中的所有整数。
您可以使用 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() + " -- ");
}
}
}