【问题标题】:Java: Getting a substring from a String after special character [duplicate]Java:在特殊字符后从字符串中获取子字符串[重复]
【发布时间】:2016-02-28 21:20:33
【问题描述】:

我有一个字符串:

/abc/def/ghfj/ijk/lmn.doc

我想从中提取 ghfj

我试过这种方式:str.substring(str.indexOf("/",9),str.indexOf("/"));

有人可以帮忙吗?

【问题讨论】:

  • 您可以在/ 上拆分字符串,然后从数组中获取第二个值。
  • Stack Overflow 不是免费的代码编写服务。我们用我们的努力换取您的努力,所以请告诉我们what have you tried到目前为止并解释您面临的问题?
  • 你也不应该在这里使用字符串方法。 Java 的类可以很好地处理路径操作,例如 File on Path
  • 我试过这种方式:str.substring(str.indexOf("/",8),str.indexOf("/"));
  • 不要将代码作为注释发布(它无法在此处正确格式化,因此难以阅读)。它的位置在您的问题中,因此请使用 edit 选项并将其添加到您的帖子中。

标签: java string substring


【解决方案1】:

假设您正在尝试查找指定文件的父位置,最简单的方法是使用 File 类或 Path 而不是 String 方法。您的代码将更具可读性并且可能更安全。

使用java.io.File

String location = "/abc/def/ghfj.doc";

File f = new File(location);
String parentName = f.getParentFile().getName();

System.out.println(parentName);

使用java.nio.file.Path

String location = "/abc/def/ghfj.doc";

Path p = Paths.get(location);
String parent = p.getParent().getFileName().toString();

System.out.println(parent);

两种情况下的输出:def


如果在/abc/def/ghfj/ijk/lmn.doc 中选择def,您可以使用Path#getName(N),其中N 是从最远的祖先到所选文件的元素的从零开始的索引,例如abc0def1,...

所以你的代码看起来像:

String location = "/abc/def/ghfj/ijk/lmn.doc";

Path p = Paths.get(location);
String parent = p.getName(1).getFileName().toString();

System.out.println(parent);// Output: def

【讨论】:

  • 但在我的情况下,我只需要使用字符串方法,即,我正在苦苦挣扎
  • “我只需要使用字符串方法”我能知道为什么吗?这是某种家庭作业吗?
  • 是的,这是我的家庭作业。
【解决方案2】:

使用正则表达式和组的快速而肮脏的解决方案:

public class AClass {

    private static final String TEXT = "/abc/def/ghfj/ijk/lmn.doc";
    private static final String REGULAR_EXPRESSION = "(/[^/]*){2}/([^/]*)/.*";

    public static void main(final String[] args) {
        final Pattern pattern = Pattern.compile(REGULAR_EXPRESSION);
        final Matcher matcher = pattern.matcher(TEXT);
        if (matcher.matches()) {
            // the following variable holds "ghfj"
            String value = matcher.group(2);
            System.out.println(value);
        }
    }
}

现在您需要更加精确,以便我们根据您的具体需求微调正则表达式。

编辑:我根据您自己的编辑编辑了解决方案。正则表达式要这样理解:

  • (/[^/]*){2} :两倍于字符 / 后跟除 / 之外的任何字符
  • / :一个额外的/character
  • ([^/]*) :一组不包含/的字符
  • /.*/ 字符后跟任何其他字符

然后matcher.group(2) 返回由上述正则表达式的([^/]*) 部分表示的组所持有的字符串。

【讨论】:

  • 不使用 split 和 pattern 方法,我们不能这样做吗?
  • 您在询问如何根据特定条件从字符串中提取子字符串。这就是正则表达式的用途(即使您的老师要求您找到使用子字符串的非稳健解决方案)
  • 是的,我的老师要求只使用字符串方法来做到这一点
猜你喜欢
  • 2016-10-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2012-12-28
  • 2015-02-15
  • 2019-03-16
相关资源
最近更新 更多