在逗号分隔字符串中查找值的更好方法(Java / Android)

时间:2013-07-21 16:17:33

标签: java android regex

假设定义了一个字符串:

String list = "apples,orange,bears,1,100,20,apple";

不将列表分成集合或数组,是否有更好的方法在列表中查找字符串?例如,如果我搜索"bear",,则应该没有结果,因为没有完全匹配(bears不计算)。您无法查找“,bear,",因为无法保证单词bear不会出现在文件的开头或结尾。

5 个答案:

答案 0 :(得分:7)

您仍然可以使用以下内容:

(^|,)bears(,|$)

它会查找逗号,或者该行的开头或结尾,我相信这是您正在寻找的。

编辑:附录

由于Denomales提到它,上面的正则表达式搜索将使用它可以找到的任何逗号(如果有的话),这样在apples,orange,bears,honey,bears,bears,bears,bears,9999,bees等列表的情况下你将获得重叠匹配,并且只计算3个熊现在的5个。在这种情况下你可以做的是使用lookarounds。可能需要一点时间来了解它们,但它的要点是它们在不消耗它们的情况下向后看,或者在角色之前。这样就可以找到所有5只熊,这就是你如何使用它们:

(?<=^|,)bears(?=,|$)

字符细分......

^表示一行的开头,以便在没有逗号的情况下,您仍会获得匹配。

,是一个字面逗号。

(?<= ... )是一个积极的外观,会在b中的bears字符后面查看,以确保内部有什么内容,即^或{{{ 1}}。

,是一个积极的向前看,会照顾(?= ... )中的s字符,以确保内部有什么内容,即bears或{{{ 1}}。

,表示一行的结尾,与$非常相似,但最后也是如此。

答案 1 :(得分:3)

您可以使用前瞻和后视来检查搜索到的单词周围没有捕获*。例如:

 Pattern p = Pattern.compile("(?<=,|^)bears(?=,|$)");

(*但是如果你只想查看“熊”这个词的存在,那就不是很重要了)

答案 2 :(得分:2)

在字符串的开头和结尾添加','

newList = ",apples,orange,bears,1,100,20,apple,";

然后您可以搜索,bear,

答案 3 :(得分:2)

我不确定您是否希望看到如果匹配发生,或 匹配发生。查看 if 匹配的最简单方法是调用

list.matches("(^|(.*,))bear((,.*)|$)");

^检查熊是否在字符串的开头。 |表示或。 .*查找零个或多个字符,,只查找逗号。 $表示字符串的结尾。括号用作匹配条件,但不一定是您想要查找的部分(即bear)。有关更多信息,请查看Java的Pattern类。

如果你想知道它发生在哪里,这是一种简单的方法。

String list = "apples,orange,bear,1,100,20,apple";//Notice that I made "bear" singular
Pattern pattern = Pattern.compile((?<=^|,)bear(?=,|$));//Compile the regex
Matcher matcher = pattern.matcher(list);//The text you want to search in
// Check all occurrences
while (matcher.find()) {
    System.out.print("Start index: " + matcher.start());
    System.out.print(" End index: " + matcher.end());
    System.out.println(" Found: " + matcher.group());
}

打印

Start index: 14 End index: 18 Found: bear

这两种解决方案都使用正则表达式。

答案 4 :(得分:0)

在字符串的开头和结尾添加 ','

此解决方案存在问题 在要比较的两个字符串之前和之后添加 ',' 需要串联String。这意味着创建 2*2=4 新的String对象。这在性能观点上非常糟糕。