正则表达式挑选长字符串的网址部分

时间:2017-04-21 05:55:34

标签: c# regex

我有一个很长的字符串,在这个字符串的某处,有一个url。在此示例中,此URL位于开头。

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

我试图在C#中为此特定字符串编写RegEx,以便在遵循以下规则后提取网址:

  1. 网址始终以http://或https://
  2. 开头
  3. 在网址之后,有时会指定端口,并不总是
  4. 在端口之后,有一个路径,在此示例中为/api,但它可以是任何字符
  5. 在路径之后,在此示例/api中,始终为/$metadata
  6. /$metadata之后有一个标签#后跟一串任意字符
  7. 网址的最后一部分始终以/$entity
  8. 结尾

    这是我迄今为止提出的RegEx:

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

    在LinqPad中测试时,会出现以下问题:

    1. 如果字符串包含多个网址,则无法匹配
    2. 它没有严格验证/ $元数据,它接受/ $ metadata1111
    3. 它没有严格验证/ $ entity,它接受/ $ entity111
    4. 显然它不接受https://。
    5. 任何人都可以给我一些提示继续,因为我被困了......

2 个答案:

答案 0 :(得分:3)

你的正则表达式不遵循正则表达式构造规则,因此没有预期的匹配。这就是你所表达的:

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

Live demo

答案 1 :(得分:2)

试试这个正则表达式:

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

Demo

给你提问:

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

  2. 正则表达式在$metadata...entity$包围[]

  3. 的部分混淆了
  4. 见2.

  5. 只需使用s

  6. 选择?