假设定义了一个字符串:
String list = "apples,orange,bears,1,100,20,apple";
不将列表分成集合或数组,是否有更好的方法在列表中查找字符串?例如,如果我搜索"bear",
,则应该没有结果,因为没有完全匹配(bears
不计算)。您无法查找“,bear,"
,因为无法保证单词bear不会出现在文件的开头或结尾。
答案 0 :(得分:7)
您仍然可以使用以下内容:
(^|,)bears(,|$)
它会查找逗号,或者该行的开头或结尾,我相信这是您正在寻找的。 p>
编辑:附录
由于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对象。这在性能观点上非常糟糕。