C# &引用;http*";正则表达式不匹配URL
我有以下代码,使用C#Regex查找所有“http://..... “根据我的意见。 这是我的密码,但我什么也没找到。请告诉我我错过了什么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(); } 这是我的输入文本(为可读性而包装)
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* "