正则表达式删除所有标点符号但保留小数点和带连字符的单词

时间:2017-03-27 04:47:07

标签: java regex

我正在尝试制作一个可以删除所有标点符号和空格的正则表达式,但保留小数点和带连字符的单词。到目前为止,我有:

String doc = "THE SOCIAL IMPACT OF THE CHERNOBYL DISASTER BY DAVID R. MARPLES (ST. MARTIN'S PRESS: $35, CLOTH; $14.95, PAPER; 316 PP., ILLUSTRATED; 0-312-02432-0)";
String doc = doc.replaceAll("[^a-zA-Z_0-9-]+", " ").toLowerCase();

删除包括小数点在内的所有点。

如果点是由字符或数字包围的,我该如何区分?

预期产出:

 the social impact of the chernobyl disaster by david r marples st martin s press 35 cloth 14.95 paper 316 pp illustrated 0-312-02432-0

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

[^a-zA-Z0-9_.-]|(?<!\d)\.(?!\d)|(?<!\w)-(?!\w)
  

更新

为连字符(?<!\w)-(?!\w)添加了条件

并替换为" "

说明:

  1. [^a-zA-Z0-9_.-]在您的初始正则表达式中包含点,最初与之匹配。
  2. (?<!\d)\.(?!\d)首先(?<!\d)表示如果点后面没有a 数字和第二个(?!\d)表示后面没有数字,然后匹配替换点
  3. Regex Demo

    Java Demo 样本来源:

    final String regex = "[^a-zA-Z0-9_.-]|(?<!\\d)\\.(?!\\d)|(?<!\\w)-(?!\\w)";
    final String string = "THE - . SOCIAL IMPACT OF THE CHERNOBYL DISASTER BY DAVID R. MARPLES "
            + "(ST. MARTIN'S PRESS: $35, CLOTH; $14.95, PAPER; 316 PP., ILLUSTRATED; 0-312-02432-0)\n\n\n";
    
    String result=string.replaceAll(regex," ");
    System.out.println(result);
    

答案 1 :(得分:0)

  

删除所有标点符号和空格,但保留小数点和带连字符的单词

您可以使用可选捕获组来匹配十进制数,并使用反向引用将其重新替换。

Java代码:

String repl = str.replaceAll("(\\.\\d+|\\w+(?:-\\w+)+)?[\\s\\p{P}]+", "$1 "));

RegEx Demo

RegEx分手:

  • ( - 开始捕获群组
    • \\.\\d+ - 匹配DOT后跟数字
    • | - 或
    • \\w+(?:-\\w+)+ - 匹配带连字符的字词
  • )? - 结束可选捕获群组,因为群组后的?
  • [\\s\\p{P}]+ - 匹配1个或更多空格或标点字符

替换字符串为:"$1 "表示可选组#1的后向引用,后跟单个空格。