Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;http*";正则表达式不匹配URL_C#_Regex - Fatal编程技术网

C# &引用;http*";正则表达式不匹配URL

C# &引用;http*";正则表达式不匹配URL,c#,regex,C#,Regex,我有以下代码,使用C#Regex查找所有“http://..... “根据我的意见。 这是我的密码,但我什么也没找到。请告诉我我错过了什么 Match m = Regex.Match(input, "http* "); while (m.Success) { Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index); m = m.NextMatch(); } 这是我的输入文本(为可读性而包装)

我有以下代码,使用C#Regex查找所有“http://..... “根据我的意见。 这是我的密码,但我什么也没找到。请告诉我我错过了什么

 Match m = Regex.Match(input, "http* ");
 while (m.Success)
 {
   Console.WriteLine("'{0}' found at index {1}.",
     m.Value, m.Index);
   m = m.NextMatch();
 }
这是我的输入文本(为可读性而包装):


问题是,在表达式
“http*”
中的
p
后面加了一个星号
*
,因此可能的匹配项如下所示:

htt
http
httpp
httppp
httpppp
等等。由于输入字符串中
p
后面没有空格,因此表达式不会得到任何匹配项

此表达式应匹配:

Match m = Regex.Match(input, "http\\S* ");

\S
表示“任何非空白字符”)。

对于初学者,请在堆栈溢出上检查前面的答案

似乎您误解了*在正则表达式中的含义

"http* "
表示
htt
后接0或更多
p
后接空格

*
不是DOS或UNIX shell中的通配符fileglob

regex中的
*
表示它所跟随的令牌为零或更多(在本例中为
p

为了便于输入,您可以编写:

https?://(\S*)
\S捕获所有非空间 ? 使s可选,以便您也可以获取https

但对于任意输入,URL后面并不总是只有空间。它可以用引号括起来,例如HTML或Javascript。follow应该允许URL后跟空格或非转义引号

https?://([^ "']*)
在[]开头使用“^”表示该模式是独占模式(除这些字符外的任何字符),并且很多时候是编写模式的最简单方法。另一种方法是编写一个完全包容的模式,这意味着您必须为希望处理的每个合法输入创建一个模式

我记不起一个兼容URL的实际正则表达式,这很重要,但你可以在Google或Stack Overflow上找到一些。就为了总的想法,我可能会写一些类似于以下的东西作为一个包容性的模式:

https?://([-+a-zA-Z0-9._&?]*)
正如Lukos在下面的评论中所指出的,记住C#escaping。对于正则表达式,我通常使用C#中的逐字字符串


var模式=@“https?://\S*”

您的源代码希望与此模式匹配

"http* "

表示查找序列
htt
,后跟零次或多次出现的字符
p
,后跟一个文本空格(“”)字符。您可以尝试匹配
“http:[^\s]*”
,它将匹配文本
http:
,后跟零个或多个非空白字符。

在选择要使用的正则表达式之前,有一个重要问题。您想查找类似URL的内容(可能以http或https开头)还是只想匹配有效的URL?一个有效的URL正则表达式是非常复杂的,一个基本的正则表达式更容易,但是您可能会在文本中收集非URL的匹配项,或者可能是看起来像真实URL的无效匹配项

你缺少了点。事实上,他想让空间知道URL何时结束。空格是正确的。@JonGrant-当然,可能是为了他的输入示例,但一般来说,空格并不是表示URL结尾的唯一分隔符。在任意HTML中,URL可以由其他内容分隔。不过,我会根据他的输入样本修改我的答案。@“http\S*”可能更明显(表示您没有在正则表达式中转义任何字符串的@符号),对于一个简单的答案,我建议使用@“(http | https)://\S*”,因为这比可能包含http的文本更可能匹配真实URL。
"http* "