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