2009-01-06 69 views
1

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

看起来像从java.util.regex包加上一些简单的数学正则表达式是走在这条 – pro 2009-01-06 10:30:59

+0

或更好的方式一样[^ <]+一个正则表达式匹配每个段 – pro 2009-01-06 12:11:28

回答

8

正则表达式应该为此工作出色。

请参阅您的JavaDoc

  • java.langString.split()
  • java.util.regex包
  • java.util.Scanner的

注:StringTokenizer的不你想要什么,因为它分裂字符,而不是字符串 - 字符串delim是一个字符的列表,其中任何一个将分裂。对于非常简单的情况(如明确的逗号分隔列表)非常有用。

2

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

+1

感谢马库斯.. 参考我发现这个.. StringTokenizer是一个遗留类,由于兼容性的原因而被保留,尽管它在新代码中的使用不受欢迎。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。 – pro 2009-01-06 10:28:47

+0

StringTokenizer分割*字符*,而不是字符串 - 字符串delim是一个字符列表,其中任何一个字符都会被分割。对于非常简单的情况(如明确的逗号分隔列表)非常有用。 – 2009-01-06 10:43:43

1

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

您还需要查看Scanner

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

您的输入看起来像您的示例,您需要获取特定标记之间的文本吗?然后使用apache commons lang包(http://commons.apache.org/lang/)执行简单的StringUtils.substringsBetween(yourString,“< B>”,“</B>”)。

如果您正在寻找一种更通用的解决方案,对于不同的或可能嵌套的标签,您可能需要查看采用html输入并创建xml文档的解析器,例如NekoHTML,TagSoup,jTidy 。然后,您可以在xml文档上使用XPath来访问内容。

相关问题