2009-01-06 65 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來訪問內容。

相關問題