【问题标题】:Better way to find value in comma separated string (Java/Android)在逗号分隔的字符串中查找值的更好方法(Java/Android)
【发布时间】:2013-07-21 16:17:33
【问题描述】:

假设一个字符串定义:

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

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

【问题讨论】:

  • 只是一个问题...为什么您不想拆分为数组?我认为您将对搜索内容有更多控制权,并且代码会更清晰,看起来更专业,添加逗号或某种或变通方法。

标签: java android regex


【解决方案1】:

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

(^|,)bears(,|$)

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

编辑:附录

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

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

人物分类...

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

, 是文字逗号。

(?&lt;= ... ) 是一个积极的后视,它将查看bears 中的b 字符后面,以确保里面有什么,即^,

(?= ... ) 是一个正向的前瞻,它会检查bears 中的s 字符以确保里面有什么,即,$

$ 表示一行的结尾,与^ 非常相似,但在结尾。

【讨论】:

  • 这将跳过您的搜索词的其他实例。表达式(^|,)bears(,|$) 只会在字符串apples,bears,bears,bears,bears,dogs 中找到两个bears
  • @Denomales 我没有考虑环视(以免使用逗号),因为 OP 似乎非常积极地寻找“字符串”。否则,环顾四周是要走的路。但是,如果您坚持,我想我可以将其添加到我的答案中。
【解决方案2】:

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

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

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

【讨论】:

  • 此解决方案将在字符串 apples,bears,bears,bears,bears,dogs 中找到所有 4 个 bears 并自动修剪前导/尾随逗号。 +1
  • @Denomales:当你找到一只熊时,其他熊永远不会远离。
【解决方案3】:

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

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

那么你可以搜索,bear,

【讨论】:

  • 这将跳过您的搜索词的其他实例。表达式(^|,)bears(,|$) 只能在字符串apples,bears,bears,bears,bears,dogs 中找到两个bears
【解决方案4】:

我不确定您是否想查看如果匹配发生或匹配发生在哪里。查看如果匹配发生的最简单方法是调用

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多