2013-05-17 27 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)); 
}