2013-05-17 33 views
1

我想解析一個包含情緒符號的字符串,如":)",":p","!","?"也是單詞。 例如,像這樣的字符串"How dare you! You have lost him two days ago:'(",我想造成這樣的:Java如何從字符串解析笑臉符號

How 
dare 
you 
! 
You 
have 
lost 
him 
two 
days 
ago 
:'(

我用StringTokenizer用隔離來解析句子,但我已經失去了情感符號。 感謝

我使用的代碼:

public class FullParser { 
    private String sentence; 
    private String separator="' ,.:!()@/<>"; 

    private ArrayList<String> mywords; 

    public FullParser(String sentence){ 
     this.sentence=sentence; 
     mywords=new ArrayList<String>(); 
     separator+='"'; 
    } 
    public void parsing(){ 
     StringTokenizer st = new StringTokenizer(sentence, separator, true); 

     while (st.hasMoreTokens()) { 
      String token = st.nextToken(); 
      if (!(token.length() == 1 && separator.indexOf(token.charAt(0)) >= 0)) { 
       //Log.i("PARSER",token);     
       mywords.add(token); 
      } 
     } 
    } 
    public ArrayList<String> getmyWords(){ 
     return mywords; 
    } 
+1

我們看一些代碼。請注意,默認分隔符是空格,但是,您可以擁有自己的:'StringTokenizer st = new StringTokenizer(text,「......」);' – Maroun

+0

您想如何處理標點符號? – zEro

回答

1

我不知道這是否會回答你的問題,但只是爲了炫耀正則表達式的力量,這裏有一個單行的解決方案: (合理測試)

sentence.split(" |(?<! |\\p{Punct})(?=\\p{Punct})|(?<=\\p{Punct})(?!\\p{Punct})"); 

\\p{Punct}爲任何單一的標點符號,或者,如果你想更具體的,您還可以使用[',\\.:!()@/<>],這意味着任何字符:',\\.:!()@/<>
(?<!...)表示負面後視,意味着以前的字符不符合此要求。
(?=...)意味着積極向前看,這意味着下一個字符匹配。
(?<=...)意味着積極的後視,意味着以前的字符匹配。
(?!...)表示否定預測,意味着下一個字符與此不匹配。
空間是一個實際的空間。
|的意思是「OR」,就像在左邊出現的那樣,或者在右邊直到最近的包圍支架出現的東西。

爲什麼它的工作需要一定的思想。

我不得不把它複雜一點,比我想要的還要多,因爲有些情況沒有奏效。

Test

有關Java正則表達式的更多信息,請參閱this

+0

public static void main(String [] args)拋出異常 \t { \t String string =「今天,她要去海灘:DD <3」; \t \t String regex =「|(?<!| \\ p {Punct})(?= \\ p {Punct})|(?<= \\ p {Punct})(?!\\ p { PUNCT})「; (字符串字符串:string.split(正則表達式)){ \t \t System.out.println(word); \t} \t}使用此代碼我不能容納最後兩個情感符號。 – reigeki

+0

@reigeki是的,我忘了表情符號可能包含A-Z或0-9。請注意,幾乎不可能區分諸如':D'和',I'之類的東西。無論你怎樣解決這個問題,都可能需要對特殊情況進行大量的檢查。還有一些不明確的地方 - 「蘋果: - 。親愛的」可以是「蘋果, - ,親愛的」或「蘋果」: - 。,:D,耳朵。如果適當的大寫字母和單詞是字典單詞並不是必需的,這可能只是一個相當大的項目(如果你想正確地做,否則只是使用所有的笑臉列表)。 – Dukeling

+0

我如何使用微笑列表? – reigeki

0

理想情況下,我會建議去正則表達式,但如果你真的想要使用很多的明/表達式,你需要應用複雜的正則表達式模式。 (你可以每天使用100+微笑進出)。

也許您可以將可能的表達式/表情符號存儲在ArrayList中作爲字符串,然後使用給定字符串上的arrayList元素進行搜索以查找表達式,然後添加新行。 作爲例如:

  //initialisation - can be done once on startup/value can be fetch from db 
     ArrayList<String> list = new ArrayList<String>() ; 
    list.add(":)"); 
    list.add("!"); 
    list.add("?"); 

    // When ever you want to parse the String 
    String input=" Hello :) How are you ? I am :) not fine! ha ha!"; 
    System.out.println(input); 
    for(String exp:list){ 
     input = input.replace(exp, "\n"+exp+"\n"); 
    } 
    System.out.println(input); 
0

你可以做的是保存所有的情感符號在數組中。您需要在執行replaceAll時避開特殊字符以避免使用正則表達式。 之後,循環所有的情緒,並在情緒存在於句子之前添加空格。

這將幫助您稍後通過SPACE分割句子。 此外,您可以刪除任何可能引入的雙SPACE。

見代碼如下─(未測試,可能有語法錯誤)

private static final String SPACE =" "; 
String[] emotionList = new String[]{':P',':)','!',....};//you might need to handle :) as :\\) to escape regex 

public void parsing(){ 
    for(String s:emotionList){ //add space before each emotion. 
     sentence=sentence.replaceAll(s,SPACE+s); 
    } 

    sentence=sentence.replaceAll(SPACE+SPACE, SPACE);//optional - replace double SPACE by single SPACE. 
    mywords = Arrays.asList(sentence.split(SPACE)); 
}