using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"(\$)
# Regexp for textmate dynamic variables
#TM_(
# BUNDLE_SUPPORT|COMMENT_(?:END|MODE|START)|CURRENT_(?:LINE|WORD)|DIRECTORY|FILE(?:NAME|PATH)|
# LINE_(?:INDEX|NUMBER)|PROJECT_DIRECTORY|SCOPE|SELECTED_(?:FILE[S]?|TEXT)|SOFT_TABS|SUPPORT_PATH|TAB_SIZE
#)
(?:
# BASIC
# BASIC: Variable name, no brackets
(?:(TM_[A-Z]+(?:_[A-Z]+)*)|([\d]))(?!\{)
|
# BRACKETED
([\{])
# BRACKETED: Variable name
(?:(TM_[A-Z]+(?:_[A-Z]+)*)|([\d]))
# BRACKETED: Post variable name expression
(?:
# Default keyword, single
([:].+?(?=[\}]))
|
# Default keyword, options
([\|].+?[\|](?=[\}]))
|
# Regular expression
(?:
([\/])
(.+?(?=\/))
([\/])
(.+?(?=\/))
([\/])
# Flags
# Not sure how to validate fully without back references?
([imx]{3})
(?=\})
)
|
(?:
([\/])
([^\/\}]+?)
(
(?<![\\]{2})
[\/]
)
([^\/\}]+?)
(
(?<![\\]{2})
[\/]
)
# Flags
# Not sure how to validate fully without back references?
([imx]{3})
)
|
# Match to bracket
(.+?(?=[\}]))?
)?
([\}])
)";
string input = @"~~ Number Variables ~~~~~~~~~
Basic
""$0""
Bracketed
""${1}
Default Value
""${2:default}""
Default Values
""${3|defaultA,defaultB|}""
Regex Replace
""${4/find/replace/gmi}""
~~ Dynamic Variables ~~~~~~~~
Basic
""$TM_SELECTION_START""
Bracketed
""${TM_SELECTION_END}""
Default Value
""${TM_SELECTED_FILE:default}""
Default Values
""${TM_SELECTED_TEXT|defaultA,defaultB|}""
Regex Replace
""${TM_SELECTED_FILES/find/replace/gmi}""
";
RegexOptions options = RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace;
foreach (Match m in Regex.Matches(input, pattern, options))
{
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for C#, please visit: https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex(v=vs.110).aspx