【问题标题】:Java - Regex to split input text but keep delimiters [duplicate]Java - 正则表达式拆分输入文本但保留分隔符[重复]
【发布时间】:2013-03-30 13:23:52
【问题描述】:

寻找一些正则表达式帮助。我正在寻找一种 Java 中的方法来按单词拆分一些输入文本,同时保留分隔符(空格、标点符号)。另一种说法是将单词拆分为它们自己的索引,其他非单词字符可以在数组的其他索引中。

这个输入文本:

"Hello, this isn't working!"

应该像这样放入一个数组中:

{"Hello", ",", "this", "isn't", "working", "!"}

{"Hello", ", ", "this", " ", "isn't", " ", "working", "!"}

我在 Python 中使用它完成了基本相同的事情:

def split_input(string):
    return re.findall(r"[\w']+|[\s.,!?;:-]", string)

但我还没有找到用 Java 完成同样事情的方法。我已经尝试过 String.split() 的前瞻/后视,我也尝试过模式匹配器,但运气不佳。

任何帮助将不胜感激!

【问题讨论】:

  • 如果空格是分隔符,那么您的文本应该至少包含 4 个元素,不是吗?
  • 为什么你想要一个数组,而你只有一个字符串?

标签: java regex


【解决方案1】:

split 不是 Python 的 findall 的 Java 模拟。 Matcher.find 是。

Pattern stuff = Pattern.compile("[\\w']+|[\\s.,!?;:-]");
Matcher matcher = stuff.matcher("Hello, this isn't working!");
List<String> matchList = new ArrayList<String>();
while (matcher.find()) {
    matchList.add(matcher.group(0)); // add match to the list
}

【讨论】:

  • 啊,我确实尝试过使用 Matcher,但没有走得太远。不过,这似乎做得很好,谢谢!
  • 这非常有用,谢谢
【解决方案2】:

试试这个:这正是你想要的。

public static void main(String[] args) {
    String str = "Hello, this isn't working!";
    String[] s = str.split("(?<=\\s+|,\\s)");
    System.out.println(Arrays.toString(s));
}

输出:

[Hello, , this , isn't , working!]

【讨论】:

    【解决方案3】:

    所以,抛开你奇怪的例子不谈,这里有一些东西应该适合你的需要(还有待测试):

    "(?=[\\w']+|[\\s.,!?;:-])"
    

    对于第一个版本。

    "(?=[\\w']+|[\\s.,!?;:-]+)"
    

    将多个分隔符保留为一个整体。

    整个想法是,当您想要拆分但保留所有字符时,只匹配位置。

    【讨论】:

      【解决方案4】:

      也许不是最好的方法,但你可以试试:

      string.replaceAll("([\\s.,!?;:-])", "$1\n");
      string.split("\n");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-24
        • 2014-11-22
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多