【问题标题】:regex, take out punctuation that is not part of a word inside a string正则表达式,取出字符串中不属于单词的标点符号
【发布时间】:2020-11-05 16:51:03
【问题描述】:

我有这个代码:

String s="  //wont won't won't ";
String[] w =  s.split("[\\s+\\/,\\.!_\\-?;:]++");

我不会将 ' 删除,因为它是单词的一部分。帮助将不胜感激 但是//我不希望//被删除。

所以我的问题如下 - 我如何在 java 中使用正则表达式来获取某个标点符号,如果它在我们有 ' 的“不会”之类的单词的一部分中不被删除,但同时保持这个-

"[\\s+\\/,\\.!_\\-?;:]++"

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    你可以使用

    String[] w = s.split("[\\s+/,.!_\\-?;:]+|\\B'|'\\B");
    

    请参阅regex demo详情

    • [\s+/,.!_\-?;:]+ - 一个或多个空格,+/,.!_-?,@98765433@34@4
    • | - 或
    • \B' - ' 位于字符串的开头或紧跟在非单词字符之前
    • | - 或
    • '\B - ' 位于字符串末尾或紧跟非单词字符。

    Java demo

    String s ="  //wont won't won't ";
    String[] w = s.split("[\\s+/,.!_\\-?;:]+|\\B'|'\\B");
    System.out.println(Arrays.toString(w));
    // => [, wont, won't, won't]
    

    如果先删除字符串开头的所有匹配项,则可以删除开头的空条目:

    String regex = "[\\s+/,.!_\\-?;:]+|\\B'|'\\B";
    String[] w2 = s.replaceFirst("^(?:"+regex+")+", "").split(regex);
    System.out.println(Arrays.toString(w2));
    // => [wont, won't, won't]
    

    【讨论】:

    • 嘿,非常有用的网站,但这没有 java 选项,这是我在这段代码中使用的语言。
    • @GilCaplan 在这里用作演示,而不是证明正则表达式有效。如果您对 Java 中的正则表达式使用有任何疑问,请告诉我。
    • @GilCaplan 我添加了一个 Java 演示 - 它是否按预期工作?
    • 在java中,它不起作用。经过一番测试,我找到了解决方案。
    • @GilCaplan “它不起作用”是什么意思?我提供了一个演示来证明它有效:我的代码为您提供了预期的结果。我还解释了为什么它会这样工作。好吧,如果您有任何 Unicode 字母,您可能需要添加 (?U) 标志:"(?U)[\\s+/,.!_\\-?;:]+|\\B'|'\\B"
    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多