我试图从一行文本中检索化合物,收缩或小数。
我为每个人写了正则表达式:
contractions => ([a-zA-Z]+\'{1}[a-zA-Z]+)
是的:不要
不:不要'别'''吨
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:二十六岁二十六岁
我正在做的是在一个字符串中包含一个段落,用空格分隔字符串,这样我就得到每个单词。有些词是加粗 喜欢 所以,有些词显然有逗号和句号。最后。
在我存储每个单词(我将其存储在倒排索引中以便稍后搜索)之前,我无法弄清楚的是:
如何删除字符串中的所有特殊字符,除非它与上述任何正则字符匹配,以便在遇到"不要"我可以存储"不要"或者如果我遇到" 二十六"我可以存储"二十六",或者如果我遇到"家庭,"我可以存储"家庭" ?
答案 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");