假设一个字符串定义:
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 对象。从性能的角度来看,这非常糟糕。