Java 构造特定的正则表达式
大家好Java 构造特定的正则表达式,java,regex,Java,Regex,大家好 上面是我在正则表达式上发现的一个简单示例,我的目标是构造一个正则表达式模式来提取这些数字中的每一个整数和双精度,并将其放在每个组中。到目前为止,我的研究只能得到整数,我不知道如何提取每个整数的双精度并将它们放入每个组?!?我理解分组的概念,因此是()。。。。查看空格并提取其中的数字会更容易吗?还是可以制作(int)(double)(double)(int)(double)(int)(double)(int)(int)表达式 这个正则表达式是否适用于您需要执行的操作 import java
上面是我在正则表达式上发现的一个简单示例,我的目标是构造一个正则表达式模式来提取这些数字中的每一个整数和双精度,并将其放在每个组中。到目前为止,我的研究只能得到整数,我不知道如何提取每个整数的双精度并将它们放入每个组?!?我理解分组的概念,因此是()。。。。查看空格并提取其中的数字会更容易吗?还是可以制作(int)(double)(double)(int)(double)(int)(double)(int)(int)表达式 这个正则表达式是否适用于您需要执行的操作
import java.util.regex.*;
public class RegexString {
public static void main( String args[] ){
// String to be scanned to find the pattern.
String line = "control.avgo: 29 50.49854 50.504984 50000 50.5000001 0.0 1 2"
String pattern = "()()()()()()()()";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value group 0: " + m.group(0) );
System.out.println("Found value group 1: " + m.group(1) );
System.out.println("Found value group 2: " + m.group(2) );
System.out.println("Found value group 3: " + m.group(3) );
System.out.println("Found value group 4: " + m.group(4) );
System.out.println("Found value group 5: " + m.group(5) );
System.out.println("Found value group 6: " + m.group(6) );
System.out.println("Found value group 7: " + m.group(7) );
} else {
System.out.println("Pattern is no good!");
}
}
}
或者,可以使用空格拆分字符串
String pattern = "([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)";
请注意,在每种情况下,您得到的值都是一个字符串。您需要使用Integer.parseInt()
或Double.parseDouble()
将它们转换为整数或双精度
编辑
要忽略第一节-control.avgo
line.split(" ");
Matcher.group(0)
专门匹配整个模式。所以不要使用它。这个正则表达式能满足您的需要吗
import java.util.regex.*;
public class RegexString {
public static void main( String args[] ){
// String to be scanned to find the pattern.
String line = "control.avgo: 29 50.49854 50.504984 50000 50.5000001 0.0 1 2"
String pattern = "()()()()()()()()";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value group 0: " + m.group(0) );
System.out.println("Found value group 1: " + m.group(1) );
System.out.println("Found value group 2: " + m.group(2) );
System.out.println("Found value group 3: " + m.group(3) );
System.out.println("Found value group 4: " + m.group(4) );
System.out.println("Found value group 5: " + m.group(5) );
System.out.println("Found value group 6: " + m.group(6) );
System.out.println("Found value group 7: " + m.group(7) );
} else {
System.out.println("Pattern is no good!");
}
}
}
或者,可以使用空格拆分字符串
String pattern = "([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)";
请注意,在每种情况下,您得到的值都是一个字符串。您需要使用Integer.parseInt()
或Double.parseDouble()
将它们转换为整数或双精度
编辑
要忽略第一节-control.avgo
line.split(" ");
Matcher.group(0)
专门匹配整个模式。所以不要使用它。你可以用int
s替换[0-9]+
之类的东西,用double
s替换[0-9]+\.?[0-9]*
,对于类似于示例的输入,你应该没问题
String pattern = "[^ ]+ ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)";
(编辑)这对您的输入正常(使用1到8的组来获取数字):
您可以用
int
s替换类似[0-9]+
的内容,用double
s替换[0-9]+\?[0-9]*
,对于类似于示例的输入,您应该没问题
String pattern = "[^ ]+ ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+) ([^ ]+)";
(编辑)这对您的输入正常(使用1到8的组来获取数字):
尝试这样做:根据您的数据格式,将非空格字符放在由空格字符或制表符分隔的每组中
String pattern = "([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+)";
为了方便起见,这里有一个测试正则表达式的链接。它非常有用。
尝试这样做:根据数据格式,在每组中放置非空格字符,并用空格字符或制表符分隔
String pattern = "([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+\\.?[0-9]*) *([0-9]+\\.?[0-9]*) *([0-9]+) *([0-9]+)";
为了方便起见,这里有一个测试正则表达式的链接。它非常有用。
看起来您正在按空间分割。这里可能不需要正则表达式。尝试
line.split(\\s+)事实上,我很惊讶你的模式能做什么。你从运行程序中得到的输出是什么?它在所有的组上都有空白值。所以。。。空白还是空字符串?输出确切地说是:找到值组0:control.avgo:29 50.49854 50.504984 50000 50.5000001 0.0 1找到值组1:找到值组2:找到值组3:找到值组4:找到值组5:找到值组6:找到值组7:…所以是空字符串。看起来您正在按空格拆分。这里可能不需要正则表达式。尝试line.split(\\s+)事实上,我很惊讶你的模式能做什么。你从运行程序中得到的输出是什么?它在所有的组上都有空白值。所以。。。空白还是空字符串?输出确切地说是:找到值组0:control.avgo:29 50.49854 50.504984 50000 50.5000001 0.0 1找到值组1:找到值组2:找到值组3:找到值组4:找到值组5:找到值组6:找到值组7:…因此为空字符串。这是输出:找到值组0:control.avgo:29 50.49854 50.50498450000 50.5000001 0.01发现值组1:control.avgo:Found value组2:29发现值组3:50.49854发现值组4:50.504984发现值组5:50000发现值组6:50.5000001发现值组7:0.0理想情况下,如果有意义,我希望每个组都特定于一个数字?不是吗清楚的值组3为50.49854。类似地,值组5为50000。您是说希望忽略control.avgo吗?不要看组0,因为它匹配整个模式。是的,完全正确,我需要正则表达式匹配器忽略控件。如果我可以删除组0和1的结果,并且只关注精确答案的数字,则基本上是avgo。如何执行此操作?组(0)专门返回整个匹配区域。别这么说。更新我的答案以满足您的需要。但实际上,您应该按空间进行拆分,然后从索引1开始。Regex听起来与您在这里所做的工作不太匹配。这是输出:找到值组0:control.avgo:29 50.49854 50.504984 50000 50.5000001 0.0 1找到值组1:control.avgo:find value组2:29找到值组3:50.49854找到值组4:50.504984找到值组5:50000找到值组6:50.5000001找到值组7:0.0理想情况下,我希望每个组都特定于一个数字,如果这有意义的话?不清楚。值组3为50.49854。类似地,值组5为50000。您是说希望忽略control.avgo吗?不要看组0,因为它匹配整个模式。是的,完全正确,我需要正则表达式匹配器忽略控件。如果我可以删除组0和1的结果,并且只关注精确答案的数字,则基本上是avgo。如何执行此操作?组(0)专门返回整个匹配区域。别这么说。更新我的答案以满足您的需要。但实际上,您应该按空间进行拆分,然后从索引1开始。正则表达式听起来不太好