它基本上是关于获取两个字符之间的字符串值。 SO 有很多与此相关的问题。喜欢:
How to get a part of a string in java?
How to get a string between two characters?
Extract string between two strings in java
等等。 但在处理字符串中的多个点并获取某些两个点之间的值时,我觉得很困惑。
我得到的包名称为:
au.com.newline.myact
我需要获取“com.”之间的值。和下一个“点(.)”。在本例中为“换行符”。我试过了
Pattern pattern = Pattern.compile("com.(.*).");
Matcher matcher = pattern.matcher(beforeTask);
while (matcher.find()) {
int ct = matcher.group();
我也尝试使用子字符串和 IndexOf 。但无法得到想要的答案。由于android中的包名称因点和字符的数量不同而异,因此我无法使用固定索引。请提出任何想法。
最佳答案
正如您可能知道的那样(基于正则表达式中的 .*
部分)dot .
是正则表达式中的特殊字符,表示任何字符(行分隔符除外)。因此,要真正使点仅代表点,您需要转义它。为此,您可以将 \
放在其前面,或将其放在 character class 内。 [.]
。
另外,要仅从括号 (.*)
中获取部分,您需要使用正确的 group 选择它索引,在您的情况下为 1
。
所以尝试一下
String beforeTask = "au.com.newline.myact";
Pattern pattern = Pattern.compile("com[.](.*)[.]");
Matcher matcher = pattern.matcher(beforeTask);
while (matcher.find()) {
String ct = matcher.group(1);//remember that regex finds Strings, not int
System.out.println(ct);
}
输出:换行
如果您只想在下一个 .
之前获取一个元素,那么您需要更改 greedy behaviour .*
中的 *
量词到 reluctant在其后面添加 ?
,例如
Pattern pattern = Pattern.compile("com[.](.*?)[.]");
// ^
另一种方法是不接受仅接受非点字符的 .*
。它们可以用 negated character class 表示: [^.]*
Pattern pattern = Pattern.compile("com[.]([^.]*)[.]");
<小时/>
如果您不想使用正则表达式,您可以简单地使用 indexOf
方法来定位 com.
及其后的下一个 .
的位置。然后你可以简单地对你想要的内容进行子串。
String beforeTask = "au.com.newline.myact.modelact";
int start = beforeTask.indexOf("com.") + 4; // +4 since we also want to skip 'com.' part
int end = beforeTask.indexOf(".", start); //find next `.` after start index
String resutl = beforeTask.substring(start, end);
System.out.println(resutl);
关于Java String-如何在android中获取包名称的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29639206/