我正在尝试制作一个可以删除所有标点符号和空格的正则表达式,但保留小数点和带连字符的单词。到目前为止,我有:
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
答案 0 :(得分:1)
你可以试试这个:
[^a-zA-Z0-9_.-]|(?<!\d)\.(?!\d)|(?<!\w)-(?!\w)
更新
为连字符(?<!\w)-(?!\w)
添加了条件
并替换为" "
说明:
[^a-zA-Z0-9_.-]
在您的初始正则表达式中包含点,最初与之匹配。(?<!\d)\.(?!\d)
首先(?<!\d)
表示如果点后面没有a
数字和第二个(?!\d)
表示后面没有数字,然后匹配替换点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分手:
(
- 开始捕获群组
\\.\\d+
- 匹配DOT后跟数字|
- 或\\w+(?:-\\w+)+
- 匹配带连字符的字词)?
- 结束可选捕获群组,因为群组后的?
[\\s\\p{P}]+
- 匹配1个或更多空格或标点字符 替换字符串为:"$1 "
表示可选组#1的后向引用,后跟单个空格。