Java字符串-如何在android中获取包名的一部分?

Java字符串-如何在android中获取包名的一部分?,java,android,string,Java,Android,String,它基本上是关于获取两个字符之间的字符串值。与此相关的问题也很多。比如: 还有更多。 但是,当我处理字符串中的多个点并获取某些两点之间的值时,我感到非常困惑 我得到的包裹名称如下: au.com.newline.myact 我需要得到com之间的值。下一个点。。在这种情况下,换行。我试过了 Pattern pattern = Pattern.compile("com.(.*)."); Matcher matcher = pattern.matcher(beforeTask); while (ma

它基本上是关于获取两个字符之间的字符串值。与此相关的问题也很多。比如:

还有更多。 但是,当我处理字符串中的多个点并获取某些两点之间的值时,我感到非常困惑

我得到的包裹名称如下:

au.com.newline.myact
我需要得到com之间的值。下一个点。。在这种情况下,换行。我试过了

Pattern pattern = Pattern.compile("com.(.*).");
Matcher matcher = pattern.matcher(beforeTask);
while (matcher.find()) {
        int ct = matcher.group();

我也尝试使用子字符串和IndexOf。但无法得到预期的答案。由于android中的包名因点数和字符数的不同而不同,所以我不能使用固定索引。请提出任何建议。

您所要做的就是将字符串按大小分开。然后遍历它们,直到找到一个等于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);
因此,您的代码看起来像:

String[] parts = packageName.split("\\.");
int i = 0;
for(String part : parts) {
    if(part.equals("com")
        break;
    }
    ++i;
}
String result = parts[i+1];

您可以使用反射来获取任何类的名称。例如:

如果我在com.some.package中有一个类运行程序,我可以运行

Runner.class.toString() // string is "com.some.package.Runner"
获取类的全名,该类恰好包含一个包名


要在“com”之后获取内容,可以使用Runner.class.toString.split。然后根据正则表达式中的.*部分,使用布尔标志迭代返回的数组。是正则表达式中的特殊字符,表示除行分隔符以外的任何字符。所以要让点代表唯一的点,你需要逃避它。为此,您可以将\放在其前面,或将其放在[.]内

另外,要仅从括号中获取部分。*您需要使用适当的索引选择它,在您的示例中,索引为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);
}
输出:换行符

如果希望在下一个元素之前只获取一个元素。那么您需要通过添加将*中的*量词更改为?在它之后

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);

在处理网站抓取之前,我做过大量的项目,我 只需创建自己的函数/util即可完成任务。正则表达式可能 如果您只是想从中提取子字符串,那么有时可能会做得过火 一个给定的字符串,就像您拥有的字符串一样。下面是我通常使用的函数 用于完成此类任务

private String GetValueFromText(String sText, String sBefore, String sAfter)
{      
  String sRetValue = "";
  int nPos = sText.indexOf(sBefore);
  if ( nPos > -1 )
  {
    int nLast = sText.indexOf(sAfter,nPos+sBefore.length()+1);
    if ( nLast > -1)
    {
      sRetValue = sText.substring(nPos+sBefore.length(),nLast);
    }
  }
  return sRetValue;
}
要使用它,只需执行以下操作:

String sValue = GetValueFromText("au.com.newline.myact", ".com.", ".");

你确定要分开吗,part?你也确定要分开。部分?下一点更好:这是让人们阅读拆分文档的第一个错误之一,正如我看到的,这里所有的回答者都犯了这个错误。你测试了你的拆分吗?好主意。只是一个更正,因为i已经增加了,最后一行是String result=parts[i];您测试了split的结果吗?@Pshemo抱歉,我没有在IDE中运行它。如果你指的是圆点的话,我已经逃过了。谢谢。这是对我错误的极好纠正。我在[]中缺少了包装圆点的部分。但如果包名包含更多点,例如:au.com.newline.myact.modelact,则此代码返回newline.myact的值。@Shasi,您希望得到什么值?只有新线?是的。我只需要换行。到目前为止,所有的答案,从Pshemo,Nomad,Sunil,Kartik,Christian-都很好@克里斯蒂安,效率很高。但我选择这个作为选择答案,因为它是对我的错误的最好和详细的纠正。
String sValue = GetValueFromText("au.com.newline.myact", ".com.", ".");