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

时间:2009-01-06 10:06:35

标签: java string

我有一个带有标记的字符串,我需要使用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 个答案:

答案 0 :(得分:8)

正则表达式应该非常有用。

请参阅您的JavaDoc

  • java.langString.split()
  • java.util.regex package
  • java.util.Scanner中

注意:StringTokenizer不是你想要的,因为它分割字符而不是字符串 - 字符串delim是一个字符列表,其中任何一个都将被拆分。这对于非常简单的案例很有用,例如明确的逗号分隔列表。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

考虑到你的例子,我认为我会使用正则表达式,特别是我会看看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 :(得分:1)

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

您还需要查看Scanner

答案 4 :(得分:1)

这有点'蛮力'并做出一些假设,但这有效。

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

答案 5 :(得分:0)

您的输入看起来像您的示例,您需要在特定标记之间获取文本吗?然后使用apache commons lang包(http://commons.apache.org/lang/)的简单StringUtils.substringsBetween(yourString,“&lt; B&gt;”,“&lt; / B&gt;”)应该可以完成这项工作。

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