代码之家  ›  专栏  ›  技术社区  ›  pro

在字符串中查找特定令牌的最佳方法是什么(在Java中)?

  •  1
  • pro  · 技术社区  · 17 年前

    我有一个带标记的字符串,我需要用Java找到它。

    如。

    string = abc<B>def</B>ghi<B>j</B>kl
    
    desired output..
    
    segment [n] = start, end
    
    segment [1] = 4, 6
    segment [2] = 10, 10
    
    6 回复  |  直到 17 年前
        1
  •  8
  •   L. Cornelius Dol    17 年前

    正则表达式应该对此非常有效。

    请参考您的JavaDoc

    • java.langString.split()
    • java.util.regex包
    • java.util。扫描仪

    注意:StringTokenizer不是你想要的,因为它会分裂 特点 ,而不是字符串-字符串delim是一个字符列表,其中任何一个字符都会被拆分。它适用于非常简单的情况,如明确的逗号分隔列表。

        2
  •  3
  •   Tom Duckering Sorin Antohi    17 年前

    鉴于你的例子,我想我会使用正则表达式,特别是Matcher提供的分组功能。

    公猫

    String inputString = "abc<B>def</B>ghi<B>j</B>kl";
    
    String stringPattern = "(<B>)([a-zA-Z]+)(<\\/B>)";
    
    Pattern pattern = Pattern.compile(stringPattern);
    Matcher matcher = pattern.matcher(inputString);
    
    if (matcher.matches()) {
    
        String firstGroup  = matcher.group(1);
        String secondGroup = matcher.group(2); 
        String thirdGroup  = matcher.group(3);
    }
    
        3
  •  2
  •   Rich Seller    17 年前

    当您想用特定字符串分隔字符串时,StringTokenizer将为您提供单独的令牌。 或者,您可以使用String中的split()方法来获取单独的String。要获得不同的数组,您必须在其中放入正则表达式。

        4
  •  1
  •   opyate    17 年前

    StringTokenizer将整个String作为参数,对于大字符串来说并不是一个好主意。 您还可以使用 StreamTokenizer

    你还需要看看 Scanner .

        5
  •  1
  •   Ron Tuffin    17 年前

    这有点“暴力”,并做出了一些假设,但这是有效的。

    public class SegmentFinder
    {
    
        public static void main(String[] args)
        {
            String string = "abc<B>def</B>ghi<B>j</B>kl";
            String startRegExp = "<B>";
            String endRegExp = "</B>";
            int segmentCounter = 0;
            int currentPos = 0;
            String[] array = string.split(startRegExp);
            for (int i = 0; i < array.length; i++)
            {           
                if (i > 0) // Ignore the first one
                {
                    segmentCounter++;
                    //this assumes that every start will have exactly one end
                    String[] array2 = array[i].split(endRegExp);
                    int elementLenght = array2[0].length();
                    System.out.println("segment["+segmentCounter +"] = "+ (currentPos+1) +","+ (currentPos+elementLenght) );
                    for(String s : array2)
                    {
                        currentPos += s.length();  
                    }
                }
                else
                {
                    currentPos += array[i].length();                
                }
            }
        }
    }
    
        6
  •  0
  •   lutzh    17 年前

    您的输入是否与示例相似,并且需要获取特定标签之间的文本?然后,使用apache commons-lang包创建一个简单的StringUtils.substringsBetween(yourString,“<B>”,“lt;/B>”)( http://commons.apache.org/lang/ )应该做这项工作。

    如果你想要一个更通用的解决方案,对于不同的、可能嵌套的标签,你可能想看看一个解析器,它接收html输入并从中创建xml文档,比如NekoHTML、TagSoup、jTidy。然后,您可以在xml文档上使用XPath来访问内容。