假设一个字符串定义:
String list = "apples,orange,bears,1,100,20,apple";
如果不将列表分成集合或数组,是否有更好的方法在列表中查找字符串?例如,如果我搜索"bear",应该没有结果,因为不会有完全匹配(bears不计算在内)。您不能查找 ",,bear,"因为无法保证 Bear 不会出现在文件的开头或结尾。
你仍然可以使用类似的东西:
(^|,)bears(,|$)
它将查找逗号,或者行的开头或结尾,我相信这就是您要查找的内容。
编辑:附录
由于 Denomales 提到了它,上面的正则表达式搜索将使用它可以找到的任何逗号(如果有的话),因此在列表的情况下您将获得重叠匹配,apples,orange,bears,honey,bears,bears,bears,bears,9999,bees并且将只计算 5 个熊中的 3 个熊。在这种情况下,您可以做的是使用环视。可能需要花点时间才能了解它们,但要点是它们会在角色后面或前面看而不消耗它们。因此,这使得找到所有 5 只熊成为可能,这就是您使用它们的方式:
(?<=^|,)bears(?=,|$)
人物分解...
^表示一行的开头,所以如果没有逗号,你仍然会得到一个匹配项。
,是文字逗号。
(?<= ... )是一个积极的向后看,并且会在b角色后面看,bears以确保里面有什么,即 a^或 a ,。
(?= ... )是一个积极的前瞻,并会照顾s角色bears以确保里面有什么,即 a,或 a $。
$表示一行的结束,工作起来很像^,但在结尾。
您可以使用前瞻和后瞻来检查搜索词周围的内容,而无需捕获 * 。例子:
Pattern p = Pattern.compile("(?<=,|^)bears(?=,|$)");
(* 但是,如果您只想检查“熊”这个词的存在,这不是很重要)
在字符串的开头和结尾添加“,”
newList = ",apples,orange,bears,1,100,20,apple,";
然后你可以搜索,bear,
我不确定您是否想查看匹配是否发生或匹配发生的位置。查看是否发生匹配的最简单方法是调用
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
这两种解决方案都使用正则表达式。
','在字符串的开头和结尾添加
这个解决方案有问题。将要比较的两个字符串的前后
相加需要串联字符串。','这意味着创建2*2=4新的 String 对象。从性能的角度来看,这非常糟糕。