2017-04-21 26 views
0

我有一个很长的字符串,在这个字符串中的某个地方,有一个url。在这个例子中,这个URL是开头的。正则表达式来挑出一个长字符串的url部分

"http://localhost:1234/api/$metadata#this_entry_is_variable_and_can_exist_of_numbers_and_characters/$entity","Version":"AAAEEEIIU="" 

我试着写在C#中的正则表达式这个特殊的字符串,下面的规则后,提取的网址:

  1. 的URL总是以http://或https://
  2. 的URL之后,端口有时指定,而不是总是
  3. 端口之后,存在一个路径,在该示例/api,但它可以是任何字符
  4. 的路径后,在此电子xample /api,它始终是/$metadata
  5. /$metadata后有一个主题标签#之后的任何字符
  6. URL的最后一部分总是/$entity

结尾的字符串,这是正则表达式我有拿出这么远:

(^http://\w+(\.\w+)*(:[0-9]+)?\/?(\/[.\^$metadata$(\#(\[a-zA-Z0-9)(\$(\entity$))]*).*?) 

当LinqPad测试此,会出现以下问题:

  1. 如果字符串包含的URL多​​,没有匹配
  2. 它不严格验证上/ $元,它接受/ $ metadata1111
  3. 它不严格验证上/ $实体,它接受/ $ entity111
  4. 显然它不接受https://呢。

谁能给我一个提示,就继续下去,因为我坚持..

回答

3

你的正则表达式不遵循正则表达式规则的建设,因此没有预期的匹配。这是你表达什么:

https?://[^/]+/[^/]+/\$metadata#[^/]+/\$entity 

Live demo

+1

哇,是快!谢谢! –

+0

@revo:只是一个小修改:正则表达式可能应该以'\ b'结尾,以避免[这种情况](https://regex101.com/r/4URxaU/2) –

+0

这就是要点,但它并不明显可以在输入字符串中指定URL结尾。 @DmitryEgorov – revo

2

试试这个正则表达式:

https?://[\w-]+(?:\.[\w-]+)*(?::\d+)?/.*?\$metadata#.*?\$entity\b 

Demo

要你的问题:

  1. 由于^,您仅匹配一个正则表达式。如果RegexOptions.Multiline没有设置,它只匹配输入字符串的开始,如果设置了RegexOptions.Multiline,则每个新行的开始(换行符后)。

  2. 其中$metadata...entity$[]

  3. 参见2包围的正则表达式被在部分混合起来。

  4. 简单地使s可选的?

+0

感谢您的回答和详细的解释。非常感激! –

+0

当这些不是必须的时候,不需要包含匹配的顶级域名部分或端口。它也接受它不应该使用的'/ $ metadata1111'。 – revo

+0

@revo:是的,你是对的。就我所见,这正是你所做的。所以我提出了你的答案,并保留我的意见,以保留OP问题的答案 –

相关问题