【问题标题】:Java: How to extract substring between two characters from a string?Java:如何从字符串中提取两个字符之间的子字符串?
【发布时间】:2012-10-03 14:09:30
【问题描述】:

我对 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 ....

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

【问题讨论】:

  • 使用split()函数!!你用谷歌搜索够了吗?
  • 您的正则表达式看起来不错,您确定从匹配器中检索到正确的组吗?看起来您打印第 0 组,而您需要第 1 组(包含括号内的内容)

标签: java regex


【解决方案1】:

这应该可行:

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 .

【讨论】:

  • 天哪,它工作得很好!想想我实际上已经花了几天时间试图解决这个问题。我没想到解决方案会这么简单。你们是最棒的!真没想到这么快就有答案了。非常感谢!
  • 很高兴能帮上忙!不要忘记accept an answer;)
【解决方案2】:

如果您仍想使用模式匹配,请查看positive 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); 
        }
    }
}

【讨论】:

  • @Amandeep - 实际上。在决定在这里发帖之前,我已经为此苦苦挣扎了几个星期。我通常很害羞寻求帮助。
  • @Cryssie 你应该阅读stackoverflow.com/questions/how-to-ask 并坦率地发帖。
  • @Amandeep - 好吧,如果我能自己解决,我不想打扰任何人。
  • @Cryssie 可以在这里提问,显然你尝试了很多很棒的东西!我已经用一个用 Java 编写的工作示例更新了我的答案。正确使用正则表达式有点棘手但功能强大。祝您工作顺利!
  • @Trevor - 老实说,与看似如此简单的解决方案相比,考虑到我试图解决这个问题所花费的工作量和时间,这相当令人尴尬......我有点喜欢学习 Java现在更多。
【解决方案3】:
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 你需要转义点\\.,使用str.replaceAll("\\S+/", "").replaceAll("\\.", "");
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2013-12-11
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多