代码之家  ›  专栏  ›  技术社区  ›  SamHoque

在字符串数组列表中匹配模式

  •  0
  • SamHoque  · 技术社区  · 7 年前

    我正在尝试在数组列表中的项之间匹配一个模式。到目前为止我已经做了,但有一个问题。我做到了 * 匹配数组列表中的任何项。我如何开始匹配是通过对第一个模式项进行索引,但是如果第一个项是 * 因为它试图索引 * 不作为项存在。

    所以基本上这就是代码。

    public boolean matchPattern(String... strings) {
        int indexOfItem = getList().indexOf(strings[0]);
        if (indexOfItem != -1) {
            for (int i = 0; i < strings.length; i++) {
                int listIndex = indexOfItem + i;
                String s = strings[i];
                if (Objects.equals("*", s)) {
                    continue;
                }
                if (!Objects.equals(getList().get(listIndex), s)) {
                    return false;
                }
            }
            return true;
        }
        return false;
    }
    

    问题发生在这条线上

    int indexOfItem = getList().indexOf(strings[0]);
    

    什么时候? strings[0] 收益率 *

    有人能告诉我怎么用这个吗 * 作为第一项?我在这一点上一无所知。基本上,一个模式会像这样

    *,1,2,3,*,5

    将成功匹配以下内容

    0,1,2,3,4,5

    随机,随机,0,1,2,3,4,5'

    但不匹配

    0,1,随机,3,4,5

    随机,随机,0,1,随机,3,4,5

    附言:这只是一个我不想匹配数字的例子。

    2 回复  |  直到 7 年前
        1
  •  0
  •   SamHoque    7 年前

    如果有人知道这个代码在某些情况下是否会失败,请随意发布一个答案,并为我尝试过的测试用例提出一个适用的解决方案。

    public static int findPattern(List<String> strings, String... pattern) {
        findFirstString:
        for (int startIndex = 0; startIndex <= strings.size() - pattern.length; startIndex++) {
            for (int i = 0; i < pattern.length; i++) {
                String p = pattern[i];
                if (!"*".equals(p) && !strings.get(startIndex + i).equals(p)) {
                    continue findFirstString;
                }
            }
            return startIndex;
        }
        return -1;
    }
    

    然后我用检查模式是否匹配 != -1 我需要索引,因为我正在向索引中注入一些数据。

        2
  •  0
  •   Bohemian    7 年前

    既然您重新进行模式匹配,就可以使用regex在一行中完成这项工作!

    从输入构建regex,将通配符转换为 "[^,]+" 然后对阵列进行测试:

    /** @return -1 if no hit, otherwise the index of the first element of the part that matches */
    public int matchPattern(String... strings) {
        String head = getList().toString().replaceAll("(.*)?\\b" + String.join(", ", strings).replace("*", "[^,]+") + "\\b.*", "$1");
        return head.isEmpty() ? -1 : head.replaceAll("[^,]", "").length();
    }