Regular Expressions 101

Community Patterns

Get path from any text

15

Regular Expression
Recommended
PCRE2 (PHP >=7.3)

/
(?<opening>\b(?<montage>[a-zA-Z]:[\/\\])|[\/\\][\/\\](?<!http:\/\/)(?<!https:\/\/)(?>[?.][\/\\](?:[^\/\\<>:"|?\n\r ]+[\/\\])?(?&montage)?|(?!(?&montage)))|%\w+%[\/\\]?)(?:[^\/\\<>:"|?\n\r ,'][^\/\\<>:"|?\n\r]*(?<![ ,'])[\/\\])*(?:(?=[^\/\\<>:"'|?\n\r;, ])(?:(?:[^\/\\<>:"|?\n\r;, .](?: (?=[\w\-]))?(?:\*(?!= ))?(?!(?&montage)))+)?(?:\.\w+)*)|(?:'(?&opening)(?=.*'\W|.*'$)(?:[^\/\\<>:'"|?\n\r]+(?:'(?=\w))?[\/\\]?)*')|"(?&opening)(?=.*")(?:[^\/\\<>:"|?\n\r]+[\/\\]?)*"
/
g

Description

Get path (windows style) from any type of text (error message, e-mail corps ...), quoted or not.

THIS IS THE SINGLE LINE VERSION ! If you want understand how it work or edit it, go https://regex101.com/r/7o2fyy

  • Relative path are not supported
  • The goal is to catch what "Look like" a path. See the limitations
  • UNC path and prefix path like [//./], [//?/] or [//./UNC/] are allowed
  • some url path like [file:///C:/] or [file://] are allowed
  • Catch path quoted with ["] and [']. But these quotes are include with the catch
  • Quoted path is not concerned by limitations

Limitations : (only unquoted path)

  • [dot] and [space] is allowed, but not in a row [dot+space] or [space+dot]
  • [dot] at end of file name isn't catched
  • INSIDE A NAME FILE (or last directory if it is a path to a directory) :
    • [comma] is not supported (it stop the catch)
    • after a first [dot], any [space] stop the catch
    • after a [space], catch is stoped if next character is not a [letter], [digit] or [-]
    • so, double [space] stop the catch

Compatibility

  • compatible PCRE, PCRE2
  • AutoHotkey : don't forget to escape "%" in "`%"
  • /!\ Powershell and .Net /!\ : this regex need some modification to be interpreted by powershell. You have to replace each (?&CapturGroupName) by \k<CapturGroupName>. Use this powershell code to do this replacement : $powershellRegex = @' [Put here the regex to replace (?&CapturGroupName) with \k<CapturGroupName>] '@ -replace '\(\?&(\w+)\)', '\k<$1>' This example code must return : [Put here the regex to replace \k<CapturGroupName> with \k<CapturGroupName>]
Submitted by nitrateag - a year ago (Last modified 8 months ago)