有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用要拆分的不同正则表达式进行Java字符串解析

str="Tick for symbol .ISEQ-IDX descriptor id 1 timestamp_sec 20130628030105 timestamp_usec 384000;EXCH_TIME 1372388465384;SENDING_TIME  0;PRICE 3957.890000;MIC XDUBIND;"

我无法控制更改如何创建此字符串的格式

我试过这个,但我不能真正得到第一个键的值“勾选符号”、“时间戳秒”等等

不仅在这个特定的字符串中,我还对如何解析带有多个正则表达式拆分的字符串感到好奇。任何帮助都将不胜感激

   String[] s = line.split(";");
    Map<String, String> m = new HashMap<String, String>();
    for (int i = 0; i < s.length; i++)
    {
          String[] split = s[i].split("\\s+");
          for (String string2 : split)
          {
             //Adding key value pair. to a map for further usage. 
           m.put(split[0], split[1]);
          }

    }

编辑
将所需输出转换为映射:
(勾选符号,.ISEQ-IDX)
(描述符id,1)
(时间戳_sec,20130628030105)
(时间戳_usec,384000)
(EXCH_时间,1372388465384)
(麦克风,XDUBIND)


共 (3) 个答案

  1. # 1 楼答案

    我认为正则表达式在这里帮不了你,不管是谁设计了输出字符串,他显然没有想到拆分

    我建议简单地用循环解析字符串,然后手动完成整个过程。或者,您可以在字符串中查找子字符串(吮吸为“勾选符号”),然后选择后面的任何单词(直到下一个空格),因为第二个参数似乎总是一个单词

  2. # 2 楼答案

    下面呢?您可以指定键值模式对的列表。键直接指定为字符串,值直接指定为正则表达式。然后遍历此列表,在文本中搜索键,然后搜索值模式,如果找到,则提取值

    我假设钥匙可以是任意顺序的,不是所有的都必须存在,可能有多个空格将它们隔开。如果您知道键的顺序,则始终可以在前一个find结束的地方开始find。如果您知道所有键都是必需的,那么如果找不到要查找的内容,可以抛出异常

        static String test="Tick for symbol .ISEQ-IDX descriptor id 1 timestamp_sec 20130628030105 timestamp_usec 384000;EXCH_TIME 1372388465384;SENDING_TIME  0;PRICE 3957.890000;MIC XDUBIND;";
    
        static List<String> patterns = Arrays.asList(
            "Tick for symbol", "\\S+",
            "descriptor id", "\\d+",
            "timestamp_sec", "\\d+",
            "timestamp_usec", "\\d+",
            "EXCH_TIME", "\\d+",
            "SENDING_TIME","\\d+",
            "PRICE", "\\d+.\\d",
            "MIC", "\\S+"
          );
    
    
            public static void main(String[] args) {
                Map<String,String> map = new HashMap<>();
    
                for (int i = 0; i<patterns.size();i+=2) {
                    String key = patterns.get(i);
                    String val = patterns.get(i+1);
                    String pattern = "\\Q" +key + "\\E\\s+(" + val + ")";
                    Matcher m = Pattern.compile(pattern).matcher(test);
    
                    if (m.find()) {
                        map.put(key, m.group(1));
                    }
                }
                System.out.println(map);
    
            }
    
  3. # 3 楼答案

    使用java中的Pattern类。util。正则表达式包,在本java Regex tutorial中逐步描述:

    private static final Pattern splitPattern = Pattern.compile("^Tick for symbol (.*) descriptor id (\\d+) timestamp_sec (\\d+) timestamp_usec (\\d+);EXCH_TIME (\\d+);SENDING_TIME  ?(\\d+);PRICE (.*);MIC (\\w+);$");
    
    private static String printExtracted(final String str) {
      final Matcher m = splitPattern.matcher(str);
      if (m.matches()) {
        final String tickForSymbol = m.group(1);
        final long descriptorId = Long.parseLong(m.group(2), 10);
        final long timestampSec = Long.parseLong(m.group(3), 10);
        final long timestampUsec = Long.parseLong(m.group(4), 10);
        final long exchTime = Long.parseLong(m.group(5), 10);
        final long sendingTime = Long.parseLong(m.group(6), 10);
        final double price = Double.parseDouble(m.group(7));
        final String mic = m.group(8);
        return "(Tick for Symbol, " + tickForSymbol + ")\n" +
             "(descriptor id, " + descriptorId + ")\n" +
             "(timestamp_sec, " + timestampSec + ")\n" +
             "(timestamp_usec, " + timestampUsec + ")\n" +
             "(EXCH_TIME, " + exchTime + ")\n" +
             "(SENDING_TIME, " + sendingTime +")\n" +
             "(PRICE, " + price + ")\n" +
             "(MIC, " + mic + ")";
      } else {
        throw new IllegalArgumentException("Argument " + str + " doesn't match pattern.");
      }
    }
    

    编辑:使用group而不是replaceAll,因为它更有意义而且速度更快