73 lines
2.2 KiB
C#
73 lines
2.2 KiB
C#
using System;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace WebsitePanel.Providers.Virtualization.Extensions
|
|
{
|
|
public static class StringExtensions
|
|
{
|
|
public static string[] ParseExact(
|
|
this string data,
|
|
string format)
|
|
{
|
|
return ParseExact(data, format, false);
|
|
}
|
|
|
|
public static string[] ParseExact(
|
|
this string data,
|
|
string format,
|
|
bool ignoreCase)
|
|
{
|
|
string[] values;
|
|
|
|
if (TryParseExact(data, format, out values, ignoreCase))
|
|
return values;
|
|
else
|
|
throw new ArgumentException("Format not compatible with value.");
|
|
}
|
|
|
|
public static bool TryExtract(
|
|
this string data,
|
|
string format,
|
|
out string[] values)
|
|
{
|
|
return TryParseExact(data, format, out values, false);
|
|
}
|
|
|
|
public static bool TryParseExact(
|
|
this string data,
|
|
string format,
|
|
out string[] values,
|
|
bool ignoreCase)
|
|
{
|
|
int tokenCount = 0;
|
|
format = Regex.Escape(format).Replace("\\{", "{");
|
|
|
|
for (tokenCount = 0; ; tokenCount++)
|
|
{
|
|
string token = string.Format("{{{0}}}", tokenCount);
|
|
if (!format.Contains(token)) break;
|
|
format = format.Replace(token,
|
|
string.Format("(?'group{0}'.*)", tokenCount));
|
|
}
|
|
|
|
RegexOptions options =
|
|
ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None;
|
|
|
|
Match match = new Regex(format, options).Match(data);
|
|
|
|
if (tokenCount != (match.Groups.Count - 1))
|
|
{
|
|
values = new string[] { };
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
values = new string[tokenCount];
|
|
for (int index = 0; index < tokenCount; index++)
|
|
values[index] =
|
|
match.Groups[string.Format("group{0}", index)].Value;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|