Java:如何从字符串中提取两个字符之间的子字符串?

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()并保存到数组中,因为我需要将其存储并稍后使用,但仍然不起作用。
最后,我尝试使用Pattern Matcher,并且在正则表达式方面遇到了问题,因为它返回带有斜杠的单词。
Regex: [\/](.*?)\s\b
Result: /WRB /MD ....

如果有更好的方法,请告诉我。如果有人能帮我弄清我的正则表达式有什么问题,请告诉我。

1
你是否已经充分使用了split()函数?你是否已经进行了足够的谷歌搜索? - Amandeep Jiddewar
你的正则表达式看起来没问题,但你确定从匹配器中检索到了正确的组吗?看起来你打印的是0组而你需要1组(包含括号内的内容)。 - jolivier
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"));

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


哇,它完美地运行了!想到我实际上花了几天时间来解决这个问题。我没想到解决方案会如此简单。你们是最棒的!我真的没有预料到会这么快得到答案。非常感谢你们! - Cryssie

6
如果你仍希望使用模式匹配,请查看正向后瞻。这将使你能够匹配以斜杠开头的单词,但实际上不匹配斜杠本身。
例如,可以这样写:
(?<=/).+?(?= |$)

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

这里是一个用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); 
        }
    }
}

@Amandeep - 实际上,我在决定在这里发布之前已经苦苦挣扎了几周。我通常太害羞了,不敢寻求帮助。 - Cryssie
@Cryssie,你应该阅读http://stackoverflow.com/questions/how-to-ask并坦率地发帖。 - Amandeep Jiddewar
@Amandeep - 嗯,如果我能自己解决问题,我就不想打扰任何人。 - Cryssie
@Cryssie 在这里问问题是可以的,显然你尝试了很多东西,这很棒!我已经更新了我的答案,并提供了一个用Java编写的可行示例。正则表达式有点棘手,但在正确使用时非常强大。祝你在任何你正在处理的事情上好运! - Jay
@Trevor - 说实话,这让我感到有些尴尬,因为我花了很多时间和精力来尝试解决这个问题,而解决方案似乎是如此简单...不过现在我更喜欢学习Java了。 - Cryssie

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 );

1
+1 你需要转义点号 \\., 使用 str.replaceAll("\\S+/", "").replaceAll("\\.", ""); - Nandkumar Tekale

0

那么 str = str.repalceAll("\\S+/", "") 呢?它将替换删除斜杠后面的非空格字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接