2

假设一个字符串定义:

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

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

4

5 回答 5

7

你仍然可以使用类似的东西:

(^|,)bears(,|$)

它将查找逗号,或者行的开头或结尾,我相信这就是您要查找的内容。

编辑:附录

由于 Denomales 提到了它,上面的正则表达式搜索将使用它可以找到的任何逗号(如果有的话),因此在列表的情况下您将获得重叠匹配,apples,orange,bears,honey,bears,bears,bears,bears,9999,bees并且将只计算 5 个熊中的 3 个熊。在这种情况下,您可以做的是使用环视。可能需要花点时间才能了解它们,但要点是它们会在角色后面或前面看而不消耗它们。因此,这使得找到所有 5 只熊成为可能,这就是您使用它们的方式:

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

人物分解...

^表示一行的开头,所以如果没有逗号,你仍然会得到一个匹配项。

,是文字逗号。

(?<= ... )是一个积极的向后看,并且会在b角色后面看,bears以确保里面有什么,即 a^或 a ,

(?= ... )是一个积极的前瞻,并会照顾s角色bears以确保里面有什么,即 a,或 a $

$表示一行的结束,工作起来很像^,但在结尾。

于 2013-07-21T16:18:56.553 回答
3

您可以使用前瞻和后瞻来检查搜索词周围的内容,而无需捕获 * 。例子:

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

(* 但是,如果您只想检查“熊”这个词的存在,这不是很重要)

于 2013-07-21T17:14:08.147 回答
2

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

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

然后你可以搜索,bear,

于 2013-07-21T16:21:12.653 回答
2

我不确定您是否想查看匹配是否发生或匹配发生的位置。查看是否发生匹配的最简单方法是调用

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

^检查 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

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

于 2013-07-21T17:20:00.637 回答
0

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

这个解决方案有问题。将要比较的两个字符串的前后
相加需要串联字符串。','这意味着创建2*2=4新的 String 对象。从性能的角度来看,这非常糟糕。

于 2015-01-30T05:28:53.370 回答