考虑用Java定义的数组中的以下字符串
G1
G12
G1-G2
G23
如果用户输入
G1
,则程序应返回G1
和G1-G2
-> [0, 2]
的索引如果用户输入
G2
,则程序应返回索引G1-G2
-> [2]
如果用户输入
G12
,则程序应返回G12
-> [1]
的索引...
一种简单的方法是用
'-'
标记每个数组元素,然后对每个元素使用equals()
。这意味着O(n ^ 2)算法。有没有更好的方法使用正则表达式,以便程序在一个循环中搜索模式并将'-'
用作定界字符? 最佳答案
解决方案是使用以下正则表达式;
.*(?=\b{value}\b).*
因此,例如,如果您希望根据要求捕获
G1
;.*(?=\bG1\b).*
在使用
\b
的地方,单词开头或结尾的锚点非常适合您的要求。有关单词边界锚\b
,here的更多信息在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/