1

我想解析一个包含情感符号的字符串,比如":)",":p","!","?"单词。例如,像这个字符串"How dare you! You have lost him two days ago:'(",我想得到这样的结果:

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;
    }
4

3 回答 3

1

我不确定这是否会回答您的问题,但是,为了展示正则表达式的强大功能,这里有一个单行解决方案:(经过合理测试)

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

\\p{Punct}是用于任何单个标点字符,或者,如果您想更具体,也可以使用[',\\.:!()@/<>],这表示以下任何字符:',\\.:!()@/<>.
(?<!...)表示负向后看,表示前面的字符与此不匹配。
(?=...)表示正向预测,表示下一个字符与此匹配。
(?<=...)表示正面向后看,表示前面的字符与此匹配。
(?!...)表示负前瞻,意味着下一个字符与此不匹配。
该空间是一个实际的空间。
|表示“或”,如出现在左侧的内容或出现在右侧的内容,直到最近的封闭括号。

为什么它起作用需要相当多的思考。

我不得不让它比我想要的复杂一点,因为有些情况不起作用。

测试

有关Java 正则表达式的更多信息,请参阅此内容。

于 2013-05-17T08:43:44.390 回答
0

理想情况下,我建议使用正则表达式,但如果您真的想使用尽可能多的明喻/表达式,则需要应用复杂的正则表达式模式。(您可以在每天的使用中找到 100 多个微笑)。

可能您可以将可能的表达式/表情符号存储为 ArrayList 作为 String ,然后在给定字符串上使用 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);
于 2013-05-17T09:06:58.300 回答
0

您可以做的是将所有情感符号存储在一个数组中。您将需要转义特殊字符以避免在执行replaceAll. 在此之后,遍历所有情绪并在句子中存在的情绪之前添加空格。

这将帮助您稍后按空格分割句子。此外,您可以删除任何可能引入的双空格。

请参阅下面的代码 - (未经测试,可能有语法错误)

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));
}
于 2013-05-17T09:14:00.237 回答