【问题标题】:Java String- How to get a part of package name in android?Java String-如何在android中获取包名的一部分?
【发布时间】:2015-04-14 23:41:30
【问题描述】:

它基本上是关于在两个字符之间获取字符串值。 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 中的包名因点数和字符数不同而不同,我不能使用固定索引。请提出任何想法。

【问题讨论】:

    标签: java android string


    【解决方案1】:

    您可能知道(基于您的正则表达式中的.* 部分)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);
    }
    

    输出:newline


    如果你想在下一个 . 之前只得到一个元素,那么你需要通过在它之后添加 ? 来将 .* 中的 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);
    

    【讨论】:

    • 这是对我错误的极好纠正。我错过了 [] 中包装点的部分。但是如果包名包含更多的点,例如:au.com.newline.myact.modelact,则此代码返回“newline.myact”的值。
    • @Shasi 你想获得什么价值?只有newline?
    • 是的。我只需要换行符。
    • 到目前为止,来自 Pshemo、Nomad、Sunil、Kartik、Christian 的所有答案都很好。 @Christian,效率的好点。但我选择此作为选定答案,因为它是对我的错误的最佳和详尽的更正。
    【解决方案2】:

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

    如果我在com.some.package 中有一个类Runner 并且我可以运行

    Runner.class.toString() // string is "com.some.package.Runner"
    

    获取类的全名,其中恰好有一个包名。

    要在“com”之后得到一些东西,你可以使用Runner.class.toString().split("."),然后用布尔标志迭代返回的数组

    【讨论】:

    • 您确定split(",") 部分吗?
    • 你也确定split(".") 部分?
    • 下一点更好:)(这是人们阅读split文档的第一个错误,我看到这里所有的回答者都犯了这个错误)
    【解决方案3】:

    你所要做的就是用“.”分割字符串。然后遍历它们,直到找到一个等于“com”的值。数组中的下一个字符串将是您想要的。

    所以你的代码看起来像:

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

    【讨论】:

    • 你测试你的split(".")了吗?
    • 好主意。只是一个更正,因为 i 已经增加,最后一行将是 String result = parts[i];
    【解决方案4】:
    private String getStringAfterComDot(String packageName) {
            String strArr[] = packageName.split("\\.");
            for(int i=0; i<strArr.length; i++){
                if(strArr[i].equals("com"))
                    return strArr[i+1];
            }
            return "";
        }
    

    【讨论】:

    • 你测试split(".")的结果了吗?
    • @Pshemo 抱歉,我没有在 IDE 中运行它。如果这就是您所指的,我已经逃脱了点。谢谢。
    【解决方案5】:

    在处理网站抓取之前,我已经完成了大量项目,我 只需创建我自己的函数/实用程序即可完成工作。正则表达式可能 如果您只想从中提取子字符串,有时会有点矫枉过正 一个给定的字符串,就像你拥有的那样。下面是我通常的功能 用于完成此类任务。

    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.", ".");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      相关资源
      最近更新 更多