【问题标题】:Split string using Regex and indexOf使用 Regex 和 indexOf 拆分字符串
【发布时间】:2013-01-23 06:47:19
【问题描述】:

我有一个简单的字符串 Ex。 1.0.0.2 我只想拆分和检索字符串的一部分: 输出:1.0.0 基本上我想删除第三个. 之后的所有文本。我尝试使用split() 函数,计算. 的出现次数,如果大于2,则得到indexOf() 第三点和substring()。有没有更简单或更快的方法来实现这一目标?也许使用 regEx

编辑: 我不知道会有多少个点。

【问题讨论】:

  • 你知道恰好会有三个点吗?如果是这样,那么lastIndexOf() 可能会比indexOf() 更有帮助。

标签: java string split substring indexof


【解决方案1】:

仅使用substringlastIndexOf 即可轻松快速地完成此操作。我认为代码可读性很强:

String str = "1.0.0.1";
String output = str.substring(0, str.lastIndexOf("."));

虽然你可以使用正则表达式实现相同的效果,但我不会打扰,它更冗长,更难理解(至少需要你更长的时间),这对于合理大小的 String 来说是相当快的.

编辑

如果您不知道您的String 有多少个点,您需要一个更复杂的方法,在这种情况下,正则表达式就可以了,+ruakh 的答案可以很好地解决问题。

如果您更喜欢可读性(当然,可读性取决于您对正则表达式的熟悉程度),您可以创建一个辅助方法来计算字符串中某个字符的出现次数,并使用它来决定是否应该将其截断与否。

【讨论】:

  • +1 打败我,甚至包括一个很好的描述和解释 为什么 正则表达式在这里会过大。不错!
  • 页面刷新只是运气问题诶。
  • 恕我直言正则表达式是必要的,因为我们不知道会有多少点。这仅在有三个点时才有效,如果有更多或更少,您将不会在(包括)第三个点之后切断输入。
  • 你说得对,jlordo,我读的问题有点太快了,编辑以反映这一点。
【解决方案2】:
String input = "1.0.0.2";
String output = input.substring(0, input.lastIndexOf("."));

【讨论】:

    【解决方案3】:

    如果您不确定是否会有三个点——所以你不能使用lastIndexOf()——那么这里有一个基于正则表达式的解决方案:

    final Matcher m = Pattern.compile("^[^.]*(?:[.][^.]*){0,2}").matcher(input);
    m.find(); // guaranteed to be true for this regex
    final String output = m.group(0);
    

    【讨论】:

    • +1 用于 group(0) 和非捕获组的可爱用法。优雅。
    • 谢谢@ruakh。你能解释一下正则表达式的字面意思吗?我明白:{0,2} 表示找到表达式的次数。开头 ^[^.]* :以任何字符开头,但 . (它是兼性的 - 星号键)。中间组(?:[.][^.]*)是什么意思?
    • @StarsSky: (?:...) 是一个分组结构,因此{0,2} 将应用于整个[.][^.]*,而不仅仅是最后一部分。 [.] 表示“这些字符中的任何一个:.”。 (我滥用.在字符类中没有特殊含义的事实,所以[.]是一种逃避它的方式。写\\.更正确,但我发现[.]更具可读性.) 所以(?:[.][^.]*) 的意思是“一个点,后跟零个或多个非点字符”。
    猜你喜欢
    • 1970-01-01
    • 2015-02-07
    • 2016-05-25
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2015-05-08
    相关资源
    最近更新 更多