考虑用Java定义的数组中的以下字符串

G1
G12
G1-G2
G23



如果用户输入G1,则程序应返回G1G1-G2-> [0, 2]的索引
如果用户输入G2,则程序应返回索引G1-G2-> [2]
如果用户输入G12,则程序应返回G12-> [1]的索引
...


一种简单的方法是用'-'标记每个数组元素,然后对每个元素使用equals()。这意味着O(n ^ 2)算法。有没有更好的方法使用正则表达式,以便程序在一个循环中搜索模式并将'-'用作定界字符?

最佳答案

解决方案是使用以下正则表达式;

.*(?=\b{value}\b).*


因此,例如,如果您希望根据要求捕获G1

.*(?=\bG1\b).*


在使用\b的地方,单词开头或结尾的锚点非常适合您的要求。有关单词边界锚\bhere的更多信息

在Java中,我有以下代码要测试;

static List<String> list = Arrays.asList("G1", "G12", "G1-G2", "G23");
public static void main(String[] args) throws Exception {
    new ArrayList<>(Arrays.asList("G1", "G12", "G2", "G23")).forEach(s -> func(s));
}

static void func(String input) {
    String regex = ".*(?=\\b" + input + "\\b).*";
    System.out.println(input + " contained in -> "
                       + Arrays.toString(IntStream.range(0, list.size())
                                       .filter(i -> list.get(i).matches(regex))
                                       .toArray()));
}


结果

G1 contained in -> [0, 2]
G12 contained in -> [1]
G2 contained in -> [2]
G23 contained in -> [3]


要查看运行中的代码,here

关于java - 正则表达式搜索字符串数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43673722/

10-12 00:32