【问题标题】:Java Regex Pattern to extract data用于提取数据的 Java 正则表达式模式
【发布时间】:2014-01-07 16:34:44
【问题描述】:

我有类似这样的传入数据

http://localhost:1111/search?id=10&time=3200&type=abc
http://localhost:1111/search?time=3200&id=11&type=abc
http://localhost:1111/search?id=12
http://localhost:1111/search?id=13&time=3200&type=abc

数据是变化的,但不是完全随机或不可预测的

那么基本上我们如何提取每个字符串中传入的 ID,而忽略其余的垃圾?

【问题讨论】:

  • @DaveNewton,我提供了样本数据。这不是确切的数据。 :) 或多或少相同的现象
  • 那么只显示 URL 会产生误导。在不了解任何数据限制的情况下,很难提供具体建议。
  • 我不知道如何在 Java 中进行子字符串匹配,但我确信它就在那里并且很容易使用如下的正则表达式:.+?id=(\d+).*?
  • @Reddy 您的示例数据似乎表明您正在使用参数...不确定您是否可以直接使用 ServletRequestHttpServletRequest 对象?

标签: java regex data-extraction


【解决方案1】:

您可以尝试使用正则表达式id=(\d+) 并提取第一个capturing group 的值:

String url = "http://localhost:1111/search?id=10&time=3200&type=abc";

Pattern id = Pattern.compile("id=(\\d+)");

Matcher m = id.matcher(url);
if (m.find())
    System.out.println(m.group(1));
10

参见PatternMatcher

【讨论】:

  • 这太棒了。简单有效。我一直认为 Pattern 以其他方式工作,我们需要包含复杂的正则表达式模式:)
  • @Reddy 你想要的正则表达式似乎很简单:) 很高兴我能帮上忙。
  • @arashajii,如果我想提取“类型”,还有一个帮助?我试过类似的,不工作。
  • @Reddy Well \d 匹配数字,看起来类型也是由非数字组成的。你可以试试"type=(\\w+)"
【解决方案2】:

如果传递了多个 ID(有效)怎么办?

恕我直言,我更愿意这样做:

URL url = new URL(<your link>);
String queryString = url.getQuery();

queryString解析成&lt;String,List&lt;String&gt;&gt;的例子,得到ID键的值

【讨论】:

    【解决方案3】:

    (?&lt;=[?&amp;])id=(\d+)(?=(?:\&amp;|$))

    在 Java 和 Perl 风格的 Regex Buddy 中工作,但在使用 Boost 正则表达式引擎的 TextPad 中不工作。 Boost 在反向引用方面存在问题。

    (?<=(?:
       [?&]    //PRECEDED BY a question-mark or ampersand
    ))          
       id=(\d+) //"id=[one-or-more-digits]"
    (?=(?:
       \&|$     //FOLLOWED BY an ampersand or the end of the input
    ))
    

    这仅捕获数字,并避免诸如捕获错误字段之类的问题

    anotherid=123sometext
    

    【讨论】:

      【解决方案4】:

      扩展@user1631616 的回答:

      这是一个示例代码:

      public static void main(String[] args) throws MalformedURLException {         
          URL aURL = new URL("http://localhost:1111/search?id=10&time=3200&type=abc");
      
          HashMap<String, String> params = new HashMap<>();
          String[] query = aURL.getQuery().split("&");
          for(String s: query) {
              String[] split = s.split("=");
              params.put(split[0],split[1]);
          }
          System.out.println(params.get("id")); 
          System.out.println(params.get("type")); 
          System.out.println(params.get("time")); 
      
      }
      

      这样,如果您的 HashMap 参数返回 null,您就知道查询字符串上没有设置该值。

      而且也不必担心参数的顺序。

      【讨论】:

        【解决方案5】:

        您究竟为什么要使用正则表达式来执行此操作?

        我会这样做:

        String url = "http://localhost:1111/search?id=13&time=3200&type=abc";
             String[] split = url.split("&");
             String id = "";    
             for (String s : split){
                 if (s.contains("id")){
                     id = s.substring(s.indexOf("id=")+3, s.length());
                 }
             }
        
             System.out.println(id);
        

        13

        【讨论】:

          【解决方案6】:

          这样的事情应该做你想做的事:

          (?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多