【问题标题】:Java, getting portion of pattern partially matched by inputJava,获取与输入部分匹配的模式部分
【发布时间】:2018-11-05 01:38:56
【问题描述】:

正如标题所说,我想获得输入部分匹配的 pattern 部分;示例:

图案:aabb 输入字符串:“aa”

此时,我将使用 Matcher 类的 hitEnd() 方法来确定模式是否被部分匹配,如answer 所示,但我也想具体找出“aa "aabb" 的 " 匹配。 有没有办法在java中做到这一点?

【问题讨论】:

    标签: java regex matching partial


    【解决方案1】:

    这可能很脏,但我们走吧……

    一旦你知道某个字符串hitEnd,进行第二次处理:

    1. 从字符串中删除最后一个字符
    2. 使用原始正则表达式搜索
    3. 如果是matches,那么你就结束了,你有字符串的一部分
    4. 如果没有,请转到 1 并重复整个过程,直到匹配为止

    如果测试字符串可能很长,则性能可能是个问题。因此,不要从最后到第一个位置,而是尝试搜索块。

    例如,考虑一个 1,000 个字符的字符串:

    1. 测试 1000/2 个字符:1-500。对于这个例子,我们认为它匹配
    2. 测试前 500 个字符 + 500/2(1-750 个位置)。对于这个例子,我们认为它不匹配。所以我们知道位置一定要放在500到750之间
    3. 现在测试 1-625 ((750+500)/2)... 如果匹配,则位置必须存在于 625-750 之间。如果不匹配,则必须在 500 到 625 之间
    4. ...

    【讨论】:

      【解决方案2】:

      Matcher 类中没有这样的功能。但是,您可以通过以下方式实现它:

      public String getPartialMatching(String pattern, String input) {
          Pattern p = Pattern.compile(pattern);
          Matcher m = p.matcher(input);
          int end = 0;
          while(m.find()){
              end = m.end();
          }
          if (m.hitEnd()) {
              return input.substring(end);
          } else {
              return null;
          }
      }
      

      首先,遍历字符串的所有匹配部分并跳过它们。例如:input = "aabbaa" m.hitEnd() 将返回 false 而不会跳过 aabb。 其次,验证字符串的左边部分是否部分匹配。

      【讨论】:

        猜你喜欢
        • 2021-09-28
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 2018-07-20
        • 2011-09-19
        相关资源
        最近更新 更多