【问题标题】:Using java to match string content使用java匹配字符串内容
【发布时间】:2015-03-18 19:57:30
【问题描述】:

我有一个这样的字符串:

String = IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS

我只想匹配并打印出115956 | 40.104730 | -88.228798。用正则表达式怎么做?

这是我的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Test3
{
   private static String REGEX = "\\d+\\.\\d";
   private static String INPUT = "IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 ";
   private static String REPLACE = "-";

   public static void main(String[] args) {

      Pattern p = Pattern.compile(REGEX);
      Matcher m = p.matcher(INPUT);           // get a matcher object
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

但我的结果是这样的:IDENTIFIER: 115956 LATITUDE: -04730 LONGITUDE: --28798

【问题讨论】:

  • m.appendReplacement(sb,REPLACE); 将找到与REPLACE 值匹配的位置。我怀疑这是你想要的。考虑将StringJoiner 与分隔符" | " 一起使用,并将您在输入中找到的每个数字放入以生成115956 | 40.104730 | -88.228798

标签: java regex


【解决方案1】:

您可以像这样使用正则表达式:

IDENTIFIER:\s(\d*)\sLATITUDE:\s(\d*\.?\d*)\sLONGITUDE:\s(.*?)\s

Working demo

比赛信息

MATCH 1
1.  [12-18] `115956`
2.  [29-38] `40.104730`
3.  [50-60] `-88.228798`

您可以像使用以下代码一样对其进行测试:

   public static void main(String args[]) {
        String line = "IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS"; 
        String pattern = "IDENTIFIER:\\s(\\d*)\\sLATITUDE:\\s(\\d*\\.?\\d*)\\sLONGITUDE:\\s(.*?)\\s";

        // 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: " + m.group(1));
            System.out.println("Found value: " + m.group(2));
            System.out.println("Found value: " + m.group(3));
        } else {
            System.out.println("NO MATCH");
        }
    }

【讨论】:

  • 但是我有一个很长的字符串并且我想捕获许多相同的模式是什么?
  • @qximin 将 if (m.find()) 更改为 while (m.find())
  • 是的,它有效!我只是在while 上做错了,然后切换到if。但是再次感谢您的帮助和我的Java文盲~~
【解决方案2】:

你可以做一个字符串replaceAll,捕获你关心的组:

class Reg {
    static String s = "IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS";

    static public void main(String[] args) {
        String r = s.replaceAll("IDENTIFIER: ([0-9]+) LATITUDE: ([-+]?(\\d*[.])?\\d+) LONGITUDE: ([-+]?(\\d*[.])?\\d+).*$", "$1 | $2 | $4");
        System.out.println(r);
    }
}

$ javac Reg.java
$ java Reg
115956 | 40.104730 | -88.228798

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2017-07-06
    相关资源
    最近更新 更多