Java,通过输入部分匹配模式的一部分

时间:2018-11-05 01:38:57

标签: java regex matching partial

正如标题所述,我想获取模式的一部分,该部分与输入部分匹配;例如:

模式:aabb 输入字符串:“ aa”

这时,我将使用Matcher类的hitEnd()方法来找出模式是否部分匹配,如此https://api.nfl.com/docs/identity/register/index.html所示,但我也想专门找出它“ aabb”的“ aa”匹配。 在Java中有什么方法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

这可能很脏,但是我们开始...

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

  1. 从字符串中删除最后一个字符
  2. 使用原始正则表达式搜索
  3. 如果它是matches,则说明您已经结束,并且拥有字符串的一部分
  4. 否则,转到1并重复整个过程,直到匹配为止

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

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

  1. 测试1000/2个字符:1-500。对于此示例,我们认为它匹配
  2. 测试前500个字符+ 500/2(1-750个位置)。对于此示例,我们认为它不匹配。因此,我们知道该位置必须在500到750之间
  3. 现在测试1-625((750 + 500)/ 2)...如果匹配,则位置必须在625-750之间。如果不匹配,则必须为500到625
  4. ...

答案 1 :(得分:0)

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。 其次,验证字符串的左部分是否部分匹配。