Java:从字符串中提取数字

时间:2014-08-11 22:26:34

标签: java regex string

我试图通过使用正则表达式从字符串中提取数据。

我的数据如下:

 12 170 0.11918
170  12 0.11918
 12 182 0.06361
182  12 0.06361
 12 198 0.05807
198  12 0.05807
 12 242 0.08457
242  12 0.08457
 11  30 0.08689
 30  11 0.08689

这里的问题是两个数字之间的空格数不同。

总而言之,我想从每一行中提取两个Integers和一个Double。 因此我试图使用正则表达式。

  Pattern p = Pattern.compile("(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))");
  Matcher m = p.matcher("  6    7781     0.01684000");
  while (m.find()) {
     System.out.println(m.group(0));  
  }

我现在的正则表达式不起作用。有没有人帮助一个合适的正则表达式因此我可以使用数据或任何其他帮助吗?

6 个答案:

答案 0 :(得分:2)

为什么不读取每一行并执行line.trim().split("\\s+")?如果您的项目已经使用了番石榴,那么也可以使用Splitter

答案 1 :(得分:1)

我建议使用Scanner

Scanner scanner = new Scanner(line);
scanner.useDelimiter(" ");
int int1 = scanner.nextInt()
int int2 = scanner.nextInt()
double double1 = scanner.nextDouble()

答案 2 :(得分:1)

检查http://txt2re.com/index-java.php3?s=%2012%20170%200.11918&11&5&12&4&13&1

你可能对下面的int1,int2和float1感兴趣

 public static void main(String[] args)
  {
    String txt=" 12 170 0.11918";

    String re1="(\\s+)";    // White Space 1
    String re2="(\\d+)";    // Integer Number 1
    String re3="(\\s+)";    // White Space 2
    String re4="(\\d+)";    // Integer Number 2
    String re5="(\\s+)";    // White Space 3
    String re6="([+-]?\\d*\\.\\d+)(?![-+0-9\\.])";  // Float 1

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find())
    {
        String ws1=m.group(1);
        String int1=m.group(2);
        String ws2=m.group(3);
        String int2=m.group(4);
        String ws3=m.group(5);
        String float1=m.group(6);
        System.out.print("("+ws1.toString()+")"+"("+int1.toString()+")"+"("+ws2.toString()+")"+"("+int2.toString()+")"+"("+ws3.toString()+")"+"("+float1.toString()+")"+"\n");
    }
  }

答案 3 :(得分:0)

试试这个:

([\d.]+) - 这将使所有字符串只包含数字或句点(。)。

编辑:

我看到你想要一组三个组。相反,这将有助于忽略空白区域,并抓住三组数字。前导^和尾随$确保您只匹配一行。

^\s*?([\d.]+)\s*([\d.]+)\s*?([\d.]+)\s*?$

答案 4 :(得分:0)

像这样的东西(根据需要修理浮动部分) -

 # raw:  (?m)^\h*(\d+)\h+(\d+)\h+(\d*\.\d+)
 # quoted: "(?m)^\\h*(\\d+)\\h+(\\d+)\\h+(\\d*\\.\\d+)"

 (?m)             # Multi-line modifier
 ^                # BOL
 \h*              # optional, horizontal whitespace
 ( \d+ )          # (1), int
 \h+              # required, horizontal whitespace
 ( \d+ )          # (2), int
 \h+              # required, horizontal whitespace
 ( \d* \. \d+ )   # (3), float

答案 5 :(得分:0)

String s = " 12 170 0.11918\n" + "170  12 0.11918 \n"
            + " 12 182 0.06361\n" + "182  12 0.06361 \n"
            + " 12 198 0.05807\n" + "198  12 0.05807 \n"
            + " 12 242 0.08457\n" + "242  12 0.08457 \n"
            + " 11  30 0.08689\n" + " 30  11 0.08689 \n";

    String[] lines = s.split("\\n");

    for( String line : lines ) {
        Scanner scan = new Scanner(line);
        scan.useDelimiter("\\s+");
        scan.useLocale(Locale.ENGLISH);
        System.out.println(scan.nextInt());
        System.out.println(scan.nextInt());
        System.out.println(scan.nextDouble());
    }

我会使用扫描仪来解决这个问题。