您有任何想法如何在字符串的 second 点之后获得第一个字符。
String str1 = "test.1231.asdasd.cccc.2.a.2";
String str2 = "aaa.1.22224.sadsada";
在第一种情况下,我应该得到a
,在第二种情况下,我应该得到2
。
我考虑过用点将字符串分隔,并提取第三个元素的第一个字符。但这似乎很复杂,我认为有更好的方法。
答案 0 :(得分:10)
正则表达式如何?
Pattern p = Pattern.compile(".+?\\..+?\\.(\\w)");
Matcher m = p.matcher(str1);
if (m.find()) {
System.out.println(m.group(1));
}
正则表达式说:以非贪婪的方式(.+?
)查找一次或多次,必须跟一个点(\\.
),然后再查找一次或多次。非贪婪的方式(.+?
),后跟点(\\.
)。匹配后,取第一组((\\w)
)中的第一个单词字符。
答案 1 :(得分:2)
在不使用模式的情况下,可以使用String类的subString
和charAt
方法来实现此目的
// You can return String instead of char
public static char returnSecondChar(String strParam) {
String tmpSubString = "";
// First check if . exists in the string.
if (strParam.indexOf('.') != -1) {
// If yes, then extract substring starting from .+1
tmpSubString = strParam.substring(strParam.indexOf('.') + 1);
System.out.println(tmpSubString);
// Check if second '.' exists
if (tmpSubString.indexOf('.') != -1) {
// If it exists, get the char at index of . + 1
return tmpSubString.charAt(tmpSubString.indexOf('.') + 1);
}
}
// If 2 '.' don't exists in the string, return '-'. Here you can return any thing
return '-';
}
答案 2 :(得分:2)
通常,正则表达式将在这里做得很好。仍然,如果您正在寻找更可定制的东西,请考虑以下实现:
private static int positionOf(String source, String target, int match) {
if (match < 1) {
return -1;
}
int result = -1;
do {
result = source.indexOf(target, result + target.length());
} while (--match > 0 && result > 0);
return result;
}
然后使用以下命令完成测试:
String str1 =“ test..1231.asdasd.cccc..2.a.2。”;
System.out.println(positionOf(str1,“。”,3)); -> //打印10
System.out.println(positionOf(str1,“ c”,4)); -> //打印21
System.out.println(positionOf(str1,“ c”,5)); -> //打印-1
System.out.println(positionOf(str1,“ ..”,2)); -> //打印22->请记住,匹配后的第一个符号位于22 + target.length()的位置,并且在char数组中也可能没有具有该索引的元素。
答案 3 :(得分:1)
您可以这样拆分String
:
public static void main(String[] args) {
String str1 = "test.1231.asdasd.cccc.2.a.2";
String str2 = "aaa.1.22224.sadsada";
System.out.println(getCharAfterSecondDot(str1));
System.out.println(getCharAfterSecondDot(str2));
}
public static char getCharAfterSecondDot(String s) {
String[] split = s.split("\\.");
// TODO check if there are values in the array!
return split[2].charAt(0);
}
我认为这不太复杂,但是无论如何,使用直接匹配的正则表达式是一个非常好的(也许更好)的解决方案。
请注意,String
输入可能少于两个点,这必须加以处理(请参见代码中的TODO
注释)。
答案 4 :(得分:1)
您可以从Java 8开始使用Java Stream API:
String string = "test.1231.asdasd.cccc.2.a.2";
Arrays.stream(string.split("\\.")) // Split by dot
.skip(2).limit(1) // Skip 2 initial parts and limit to one
.map(i -> i.substring(0, 1)) // Map to the first character
.findFirst().ifPresent(System.out::println); // Get first and print if exists
但是,我建议您坚持使用Regex,这样做更安全,更正确:
这是您需要的正则表达式(演示可以在Regex101上找到):
.*?\..*?\.(.).*
别忘了用双斜杠\\
来转义特殊字符。
String[] array = new String[3];
array[0] = "test.1231.asdasd.cccc.2.a.2";
array[1] = "aaa.1.22224.sadsada";
array[2] = "test";
Pattern p = Pattern.compile(".*?\\..*?\\.(.).*");
for (int i=0; i<array.length; i++) {
Matcher m = p.matcher(array[i]);
if (m.find()) {
System.out.println(m.group(1));
}
}
此代码在每行上打印两个结果:a
,2
和一个空通道,因为在第三个字符串上没有匹配项。
答案 5 :(得分:0)
使用String.indexOf
的简单解决方案:
public static Character getCharAfterSecondDot(String s) {
int indexOfFirstDot = s.indexOf('.');
if (!isValidIndex(indexOfFirstDot, s)) {
return null;
}
int indexOfSecondDot = s.indexOf('.', indexOfFirstDot + 1);
return isValidIndex(indexOfSecondDot, s) ?
s.charAt(indexOfSecondDot + 1) :
null;
}
protected static boolean isValidIndex(int index, String s) {
return index != -1 && index < s.length() - 1;
}
在最坏的情况下,使用indexOf(int ch)
和indexOf(int ch, int fromIndex)
只需要检查所有字符。
第二个版本使用indexOf
和Optional
实现相同的逻辑:
public static Character getCharAfterSecondDot(String s) {
return Optional.of(s.indexOf('.'))
.filter(i -> isValidIndex(i, s))
.map(i -> s.indexOf('.', i + 1))
.filter(i -> isValidIndex(i, s))
.map(i -> s.charAt(i + 1))
.orElse(null);
}
答案 6 :(得分:-1)
这是另一种方法,不是单行代码,而是简单的方法。
public class Test{
public static void main (String[] args){
for(String str:new String[]{"test.1231.asdasd.cccc.2.a.2","aaa.1.22224.sadsada"}){
int n = 0;
for(char c : str.toCharArray()){
if(2 == n){
System.out.printf("found char: %c%n",c);
break;
}
if('.' == c){
n ++;
}
}
}
}
}
找到字符:a
找到字符:2