5

我对 Java 比较陌生,我需要一些帮助来从字符串中提取多个子字符串。字符串的示例如下所示:

String = "How/WRB can/MD I/PRP find/VB a/DT list/NN of/IN celebrities/NNS '/POS real/JJ names/NNS ?/."

期望的结果:WRB MD PRP VB DT NN IN NNS POS JJ NNS

我有一个文本文件,其中可能包含数千个类似的带有 POS 标记的行,我需要从中提取 POS 标签并根据 POS 标签进行一些计算。

我曾尝试使用标记器,但并没有真正得到我想要的结果。我什至尝试使用split()并保存到数组,因为我需要存储它并稍后使用它,但这仍然不起作用。

最后,我尝试使用模式匹配器,但正则表达式出现问题,因为它返回带有正斜杠的单词。

Regex: [\/](.*?)\s\b
Result: /WRB /MD ....

如果有更好的方法可以做到这一点,请告诉我,或者是否有人可以帮助我找出我的正则表达式有什么问题。

4

4 回答 4

8

这应该有效:

String string = "How/WRB can/MD I/PRP find/VB a/DT list/NN of/IN celebrities/NNS '/POS real/JJ names/NNS ?/.";
System.out.println(string.replaceAll("[^/]+/([^ ]+ ?)", "$1"));

印刷:WRB MD PRP VB DT NN IN NNS POS JJ NNS .

于 2012-09-03T11:26:07.130 回答
6

如果您仍想使用模式匹配,请查看积极的lookbehinds。它将允许您匹配以斜杠开头的单词,但实际上不匹配斜杠本身。

一个例子是这样的:

(?<=/).+?(?= |$)

匹配以斜杠开头,后跟空格或字符串结尾的任何内容

这是一个用 Java 编写的工作示例:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.LinkedList;

public class SO {
    public static void main(String[] args) {
        String string = "How/WRB can/MD I/PRP find/VB a/DT list/NN of/IN celebrities/NNS '/POS real/JJ names/NNS ?/.";
        Pattern pattern = Pattern.compile("(?<=/).+?(?= |$)");
        Matcher matcher = pattern.matcher(string);

        LinkedList<String> list = new LinkedList<String>();

        // Loop through and find all matches and store them into the List
        while(matcher.find()) { 
            list.add(matcher.group()); 
        }

        // Print out the contents of this List
        for(String match : list) { 
            System.out.println(match); 
        }
    }
}
于 2012-09-03T11:20:35.557 回答
2
String string = "How/WRB can/MD I/PRP find/VB a/DT list/NN of/IN celebrities/NNS '/POS real/JJ names/NNS ?/.";

string = string .replaceAll("\\S+/", "").replace(".", "");  

System.out.println(string );
于 2012-09-03T11:32:19.207 回答
0

怎么样str = str.repalceAll("\\S+/", "")?它将替换删除非空白字符,后跟斜杠。

于 2012-09-03T11:22:15.657 回答