正则表达式匹配带字的第一个URL

时间:2014-05-29 11:10:30

标签: c# .net regex

我需要的是什么:

我有一个这样的字符串:

  

自行车:http://website.net/bikeurl玩具:http://website.net/rc-cars
    日历:http://website.net/schedule

我想匹配我指定的单词和后面的第一个网址。因此,如果我将单词指定为“Bike”,我应该得到:

  

自行车:http://website.net/bikeurl

或者如果可能的话,只有自行车词的网址:

  

http://website.net/bikeurl

或者,如果我指定玩具,我应该得到:

  

玩具:http://website.net/rc-cars

或如果可能的话

  

http://website.net/rc-cars

我在用什么:

我正在使用这个正则表达式:

(Bike)(.*)((https?|ftp):/?/?)(?:(.*?)(?::(.*?)|)@)?([^:/\s]+)(:([^/]*))?(((?:/\w+)*)/)([-\w.]+[^#?\s]*)?(\?([^#]*))?(#(.*))?

结果:

匹配:

  

自行车:http://website.net/bikeurl玩具:http://website.net/rc-cars

我只想要:

  

自行车:http://website.net/bikeurl

我不是正则表达式专家,我尝试使用{n} {n,},但它要么不匹配,要么匹配相同

我正在使用.NET C#所以我在这里测试http://regexhero.net/tester/

3 个答案:

答案 0 :(得分:0)

这是另一种方法:

Bike(.*?):\s\S*

以下是如何仅获取相应的URL候选者的示例:

var inputString = "Bike’s: http://website.net/bikeurl Toys: http://website.net/rc-cars Calendar: http://website.net/schedule";
var word = "Bike";
var url = new Regex( word + @"(.*?):\s(?<URL>\S*)" )
    .Match( inputString )
    .Result( "${URL}" );

答案 1 :(得分:0)

如果我理解你的问题。您需要一个通用的正则表达式,它将根据单词选择一个URL。这是一个可以选择包含bike的网址的人:

(.(?<!\s))*\/\/((?!\s).)*bike((?!\s).)*

如果您将bike替换为任何其他字词。它会选择相应的网址。

编辑1:
根据您的编辑,以下是根据网址前面的字词进行选择的内容:

(TOKEN((?!\s).)*\s+)((?!\s).)*

它会选择单词+ URL。例如 (Bike((?!\s).)*\s+)((?!\s).)*会选择Bike’s: http://website.net/bikeurl (Toy((?!\s).)*\s+)((?!\s).)*会选择Toys: http://website.net/rc-cars (Calendar((?!\s).)*\s+)((?!\s).)*会选择Calendar: http://website.net/schedule
如果要确保字符串包含URL,可以改为使用:

(TOKEN((?!\s).)*\s+)((?!\s).)*\/\/((?!\s).)*

它将确保字符串的第二部分即。应该包含URL的那个之间有一个//

答案 2 :(得分:0)

如果你真的需要确定它是一个网址:

Validate urls with Regex

Regex to check a valid Url

这是另一个解决方案。我会将字典中的自行车,玩具和日历分开,然后将网址作为值,然后在需要时调用它。

        Dictionary<string, string> myDic = new Dictionary<string, string>() 
        { 
            { "Bike’s:",   "http://website.net/bikeurl" },

            { "Toys:",     "http://website.net/rc-cars" },

            { "Calendar:", "http://website.net/schedule"  }
        };

        foreach (KeyValuePair<string, string> item in myDic)
        {
            if (item.Key.Equals("Bike's"))
            {
                 //do something
            }
        }

希望我的一个想法可以帮到你。