Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何从字符串到字符c获取子字符串?_Java - Fatal编程技术网

在java中,如何从字符串到字符c获取子字符串?

在java中,如何从字符串到字符c获取子字符串?,java,Java,我有一个字符串(基本上是遵循命名约定的文件名)abc.def.ghi 我想在第一个(即一个点)之前提取子字符串 在java doc api中,我似乎找不到一个字符串中的方法可以做到这一点。 我错过什么了吗?如何操作?查看String.indexOf和String.substring 请确保为索引of检查-1,或者您可以尝试类似的操作 “abc.def.ghi.”子字符串(0,“abc.def.ghi.”索引(c)-1)使用正则表达式怎么样 String firstWord = filename.

我有一个字符串(基本上是遵循命名约定的文件名)
abc.def.ghi

我想在第一个
(即一个点)之前提取子字符串

在java doc api中,我似乎找不到一个字符串中的方法可以做到这一点。

我错过什么了吗?如何操作?

查看
String.indexOf
String.substring


请确保为
索引of

检查-1,或者您可以尝试类似的操作

“abc.def.ghi.”子字符串(0,“abc.def.ghi.”索引(c)-1)

使用正则表达式怎么样

String firstWord = filename.replaceAll("\\..*","")
这将用“”替换从第一个点到结尾的所有内容(即清除它,留下您想要的内容)

这里有一个测试:

System.out.println("abc.def.hij".replaceAll("\\..*", "");
输出:

abc

在java.lang.String中,您可以得到一些方法,如indexOf():它返回char/String的第一个索引。 和lstIndexOf:返回字符串/字符的最后一个索引

从Java文档:

  public int indexOf(int ch)
  public int indexOf(String str)
返回此字符串中指定字符第一次出现的索引

你只需按字符串即可

public String[] split(String regex)
请注意,java.lang.String.split使用分隔符的正则表达式值。 基本上是这样的

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot
当然,为了Clarity,这被分成多行。它可以写成

String beforeFirstDot = filename.split("\\.")[0];

如果您的项目已经使用了StringUtils,那么StringUtils为此提供了一个很好的方法:

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

请参见javadoc,公认的答案是正确的,但它没有告诉您如何使用它。这就是如何将indexOf和substring函数一起使用

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}

下面是一段代码,它从
字符串
返回一个子字符串,直到给定的字符列表中的任何一个:

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}
/**
*返回给定原始字符串的子字符串,直到第一次出现为止
*任何给定字符的。
*
*例如,原件“ab&cd ef&gh”
* 1. 分隔符{'&','-'}
*结果:“ab”
* 2. 分隔符{'~','-'}
*结果:“ab&cd”
* 3. 分隔符{'~','='}
*结果:“ab&cd ef&gh”
*
*@param-original原始字符串
*@param字符分隔符,直到要考虑的子字符串
*@返回不存在分隔符的子字符串或原始字符串
*/
公共静态字符串substringFirstOf(原始字符串,列表字符){
返回字符。stream()
.map(原始::indexOf)
.filter(最小值->最小值>0)
.reduce(整数::min)
.map(位置->原始子字符串(0,位置))
.orElse(原件);
}
这有助于:

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

    return corporateId;
}

字符串中没有'c'的will崩溃,因为indexOf将返回-1@Umer如果文件名是def.hij.klm
,该怎么办?那么您的代码将如何工作?(您的代码只适用于这一个示例-您还可以编写一个返回
“abc”
-同样适用的函数)@Bohemian:我知道缺少边界情况和检查。这是对具体问题的一个具体回答,其目的是通过一个例子给出总体思路:)@TofuBeer:好吧,好吧,前面有一个混淆(即一个点)没有出现在实际的帖子中。我认为并希望我的回答能给出解决这类问题的一般思路;如果(ix>-1)指令串=指令串。子指令串(0,ix);我不知道为什么乌默建议减去1。substring的第二个参数是up to,但不包括在内。我没有投反对票(我同意人们无缘无故投反对票很糟糕),但你的解决方案非常昂贵,也不是非常明显。@Knickerless Noggins我可以描述它,如果你想了解具体情况,我也可以这样做。。。但我不确定如何在评论中做到这一点(可能必须再做一个问题/回答)。它很昂贵,因为它会创建一个全新的字符串,同时替换所有字符。子字符串只是将视图返回到字符串中。那有帮助吗?@TofuBeer你错了。字符串是。子字符串不返回视图。从字符串方法返回的每个字符串都是一个新字符串。@Knickerless Noggins他错了。。。见最近的评论。而且,它是足够有效的。代码密度很高-为了“性能”起见,必须大量使用它来证明添加更多代码的合理性。JDK 7中的代码显然发生了变化,您的建议是不正确的,因为java.lang.String.split将regex值作为属性,而不仅仅是字符串。在你的例子中,所有的“.”都需要改为“\\”,然后它就可以工作了:)我喜欢正则表达式,但每次都是这样。简短而甜蜜。还要记住indexOf给出了子字符串的第一个索引。正如@Sam B所说,您没有解释如何使用它。这是无效代码,因为您不能在没有大括号的If语句体中放置变量声明。@Clashoft这里暗示了大括号。比其他解决方案更干净。
  private String getTextBefore(final String wholeString, String before){
   final int indexOf = wholeString.indexOf(before); 
   if(indexOf != -1){
       return wholeString.substring(0, indexOf);
   }
   return wholeString;
}