如何将段落标记为单词?

时间:2014-06-29 19:43:53

标签: c# regex

我有一句话:

var input = @"I go to to http://www.google.com.I don't like cats.";

我想尝试找到句子中的所有单词。我需要用词语来获取字符串。

当我String stripped = Regex.Replace(input,"\\p{P}", "");时,我按预期得到I go to to httpwwwgooglecomI dont like cats

是否有一种聪明的方式来获取I go to to http://www.google.com I dont like cats而不必执行大量if then条件。

我的问题是我不知道如何以可靠的方式检测网址,以便能够将它们视为一个单词。

这里尝试了lucene是它取消的条款:

术语=我 长期=去 长期= HTTP 长期= www.google.com.i 长期=不 长期=喜欢 术语=猫

3 个答案:

答案 0 :(得分:1)

没有一个好方法可以做到这一点,因为域可以包含不同数量的单词,所有这些示例都是有效的域名:

您可以保留顶级域名列表,但截至今年(或去年),任何有足够资金的人都可以buy a top level domain

但是,在您的确切情况下,您可以解析字符串,因为没有顶级域只包含一个字符。

可能的解决方案:

如果您需要解决方案可靠,您可以尝试查找每个域名。如果您无法为域找到IP(=将最后一个单词移动到单独的单词并再试一次),则字符串太长可能会很长。

答案 1 :(得分:1)

使用您当前的输入,您可以使用:

\b(?:(?<=http://\S*?)(?!www)\w+\.\w+|(?!www)[\w']+(?!://))\b

请参阅the demo

当然,这引出了一个问题&#34;什么是可接受的词&#34;,所以这个表达式可以根据不同的要求和条件进行调整。

在C#中:

var myRegex = new Regex(@"\b(?:(?<=http://\S*?)(?!www)\w+\.\w+|(?!www)[\w']+(?!://))\b", RegexOptions.Multiline);
string resultString = myRegex.Match(yourString).Value;
Console.WriteLine(resultString);

答案 2 :(得分:0)

你可以先用空格分割然后修剪标点符号。

char[] separators = new char[] {' ', '\t', '\r', '\n'};
char[] trimchars = new char[] {'.', ','}; 
var input = @"my string with a http://google.com/query url. I only
    want to have words";

var words = input.Split(separators, StringSplitOptions.RemoveEmptyEntries).Select(x=> x.Trim(trimchars));

foreach (var x in words)
    Console.WriteLine(x);