我有一句话:
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 长期=不 长期=喜欢 术语=猫
答案 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);