在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;
}