Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java'解析数值;s正则表达式类_Java_Regex - Fatal编程技术网

使用Java'解析数值;s正则表达式类

使用Java'解析数值;s正则表达式类,java,regex,Java,Regex,在Java中,我试图解析ASCII输出文件中的数据。下面显示了一个数据示例。这些值的格式为精度5标度3,值之间不存在空格 80.234如果它们的格式都相同,那么可能更容易将6个字符作为字符串读取,然后使用Double.parseDouble将其从字符串解析为双精度?正则表达式中只有1个组。使用while循环来枚举所有这些参数。(见): String testPattern=“68.65761.25659.01057.67657.14857.06457.41658.77861.16268.641”

在Java中,我试图解析ASCII输出文件中的数据。下面显示了一个数据示例。这些值的格式为精度5标度3,值之间不存在空格


80.234如果它们的格式都相同,那么可能更容易将6个字符作为字符串读取,然后使用Double.parseDouble将其从字符串解析为双精度?

正则表达式中只有1个组。使用
while
循环来枚举所有这些参数。(见):

String testPattern=“68.65761.25659.01057.67657.14857.06457.41658.77861.16268.641”;
Pattern p=Pattern.compile(“\\d+\\.\\d{1,3}”);
Matcher m=p.Matcher(testPattern);
当(m.find())/使用时,固定长度在这里可以很好地工作

Iterable<String> numbers = Splitter.fixedLength(6).split(testPattern);

你希望它能以某种方式分解出各个数字,因为这就是你匹配它们的方式,但它不是这样的。您的正则表达式所做的是一次捕获一个数字并将其放入第1组。它这样做了十次,每次都用新值覆盖组#1的内容。完成后,
group()
返回您发现的整个字符串,而
group(1)
只返回第十个数字,
68.641

这是一个常见错误,可能是因为Java缺少内置的“查找所有匹配项”机制。NET有它的
Matches()
方法,PHP有
preg\u match\u all()
,Python有
re.findall()
,Perl和JavaScript有
/g
修饰符。。。每个主要风格都有一种机制,可以返回所有匹配项的数组或匹配项上的迭代器,或者两者都返回。但是在Java中,您需要在
while
循环中调用
find()
,正如@KennyTM所演示的那样

对于Java来说,这是一个恼人的遗漏,但并不令人惊讶。它的效果是迫使我们编写更详细、更少惯用的代码,这从一开始就是Java的标志。但是,如果您真的想将此任务简化为一行程序,那么有一个古老的“在环顾四周时拆分”技巧:

…或:

String[] result = source.split("(?<=\\G\\d{2}\\.\\d{3})");

String[]result=source.split(“(?这将起作用,即使他的regexp是错误的。我猜它应该是“\\d\\d\.\\d\\d\\d”。两端的可变长度匹配组只起作用,因为数字总是在最大长度,所以greediness做正确的事情。
Iterable<String> numbers = Splitter.fixedLength(6).split(testPattern);
private static final Splitter SPLITTER = Splitter.fixedLength(6);

...

public void someMethod(String stringToParse) {
  for(Double value : Iterables.transform(SPLITTER.split(stringToParse),
                                         Numbers.doubleParser())) {
    ...
  }
}
String[] result = source.split("(?=\\B\\d{2}\\.\\d{3})");
String[] result = source.split("(?<=\\G\\d{2}\\.\\d{3})");