从字符串中检索正则表达式匹配并修剪其他/特殊字符

时间:2016-11-29 01:25:26

标签: java regex string

我试图从一行文本中检索化合物,收缩或小数。

我为每个人写了正则表达式:

contractions => ([a-zA-Z]+\'{1}[a-zA-Z]+)

是的:不要 m' n

不:不要'别'''吨

decimal numbers => ([0-9]+\.{1}[0-9]+)

是:0.1 11.11

否:.1 1. 1..0 m.n

compound => ([a-zA-Z]+\-{1}[a-zA-Z]+)

是:26 m-n

NO:二十六岁二十六岁

我正在做的是在一个字符串中包含一个段落,用空格分隔字符串,这样我就得到每个单词。有些词是加粗 喜欢 所以,有些词显然有逗号和句号。最后。

在我存储每个单词(我将其存储在倒排索引中以便稍后搜索)之前,我无法弄清楚的是:

如何删除字符串中的所有特殊字符,除非它与上述任何正则字符匹配,以便在遇到"不要"我可以存储"不要"或者如果我遇到" 二十六"我可以存储"二十六",或者如果我遇到"家庭,"我可以存储"家庭" ?

1 个答案:

答案 0 :(得分:0)

试试这个正则表达式:(?:\s|^)(?!\w+-\w+|\w+'\w+|\d+\.\d+).*?\s并替换为空格:

String content = "put your string here";
Pattern pattern = Pattern.compile("(?:\\s|^)(?!\\w+-\\w+|\\w+'\\w+|\\d+\\.\\d+).*?\\s");
Matcher matcher = pattern.matcher(content);
String result = matcher.replaceAll(" ");

此外,这会删除family之类的字词,因为它与您提及的任何类别都不匹配,是您想要的吗?

我将[a-zA-Z]替换为\w而将[0-9]替换为\d,它会做同样的事情,但我认为正则表达式更具可读性。此外,您不需要{1},缺少量词始终被视为一个。

编辑:如果您要删除句子中不属于任何类别的特殊字符:[^\w ]|(\w+-\w+|\w+'\w+|\d+\.\d+)并替换为\1

String content = "put your string here";
Pattern pattern = Pattern.compile("[^\\w ]|(\\w+-\\w+|\\w+'\\w+|\\d+\\.\\d+)");
Matcher matcher = pattern.matcher(content);
String result = matcher.replaceAll("\\1");