Кто-нибудь знает, есть ли эквивалентная функциональность функции Windows API PathMatchSpec()
в .NET?Эквивалент PathMatchSpec для .NET
ответ
Если вы не можете получить функциональность, используя регулярные выражения (я считаю, что это так), как насчет использования PathMatchSpec() через PInvoke?
http://www.pinvoke.net/default.aspx/shlwapi/PathMatchSpec.html
Вы можете попробовать How to implement glob in C# или, конечно, есть в PInvoke route, если это необходимо.
Я не знаю метода, встроенный в .NET, однако это тривиальное дублировать с Regex:
public static bool PathMatchSpec(String path, String spec)
{
String specAsRegex = Regex.Escape(spec).Replace("\\*", ".*").Replace("\\?", ".") + "$";
return Regex.IsMatch(path, specAsRegex);
}
Очевидно, это предполагает, что упоминается пространство имен System.Text.RegularExpressions. Если вы собираетесь делать это с такой же спецификацией, вы также можете кэшировать Regex.
EDIT TO ADD: P/Invoke - это действительно опция, но подпись для PathMatchSpec указывает, что для нее требуется строка ANSI, поэтому для каждого вызова вы будете выполнять преобразование набора символов. Имейте это в виду, если вы идете по этому маршруту. В таком случае, возможно, предпочтительнее PathMatchSpecEx.
Короче ... не то, что я не знаю ... но, возможно, это может помочь вам в этом (обратите внимание, немного большего времени, чем вы могли бы хотеть, но он служил мне хорошо):
sealed public class WildcardMatch
{
private static Regex wildcardFinder = new Regex(@"(?<wildcards>\?+|\*+)", RegexOptions.Compiled | RegexOptions.Singleline);
private Regex wildcardRegex;
public WildcardMatch(string wildcardFormat) : this(wildcardFormat, false) { }
public WildcardMatch(string wildcardFormat, bool ignoreCase)
{
if (wildcardFormat == null)
throw new ArgumentNullException("wildcardFormat");
StringBuilder patternBuilder = new StringBuilder("^");
MatchCollection matches = this.wildcardFinder.Matches(wildcardFormat);
string[] split = this.wildcardFinder.Split(wildcardFormat);
for (int ix = 0; ix < split.Length; ix++)
{
// Even indexes are literal text, odd indexes correspond to matches
if (ix % 2 == 0)
patternBuilder.Append(Regex.Escape(split[ix]));
else
{
// Matches must be substituted with Regex control characters
string wildcards = matches[ix/2].Groups["wildcards"].Value;
if (wildcards.StartsWith("*", StringComparison.Ordinal))
patternBuilder.Append("(.*)");
else
patternBuilder.AppendFormat(CultureInfo.InvariantCulture, "({0})", wildcards.Replace('?', '.'));
}
}
patternBuilder.Append("$");
this.wildcardRegex = new Regex(
patternBuilder.ToString(),
RegexOptions.Singleline | (ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None));
}
public bool IsMatch(string value)
{
if (value == null)
return false;
return this.wildcardRegex.IsMatch(value);
}
public IEnumerable<string> ExtractMatches(string value)
{
if (value == null)
yield break;
Match match = this.wildcardRegex.Match(value);
if (!match.Success)
yield break;
for (int ix = 1; ix < match.Groups.Count; ix++)
yield return match.Groups[ix].Value;
}
}
Обратите внимание, что при использовании anelsons 'Regex.Escape()' код экранирования может быть упрощен. – jerryjvl
- 1. Typogrify эквивалент для .NET
- 2. .NET-эквивалент для GetLastInputInfo?
- 3. Beanshell эквивалент для .Net
- 4. эквивалент jconsole для .Net?
- 5. preg_match для .NET эквивалент
- 6. Эквивалент "openssl_seal" для .NET?
- 7. Эквивалент MappedBytesBuffer для .NET?
- 8. SocketStream эквивалент для .Net
- 9. Maven эквивалент для .Net
- 10. KeyStorage. Net эквивалент для Java?
- 11. .net эквивалент для php preg_replace
- 12. TimeZoneInfo.ConvertTime эквивалент для .NET 2.0?
- 13. . NET-эквивалент "net group/domain"?
- 14. Java-эквивалент класса .NET .NET?
- 15. Java-эквивалент WebClient .Net
- 16. Java.lang.Character.isUnicodeIdentifierStart() эквивалент в .NET
- 17. .NET-эквивалент size_t
- 18. SAX эквивалент в .Net
- 19. Java-эквивалент .NET SSLStream
- 20. . Net эквивалент VB6 Recordset
- 21. .NET-эквивалент скрипта configure
- 22. Java-эквивалент .net-свойств?
- 23. Java-эквивалент .net recycle
- 24. .NET JAXB эквивалент?
- 25. .net эквивалент htmlunit?
- 26. JMS эквивалент в .Net
- 27. .NET-эквивалент StrCmpLogicalW
- 28. .NET Эквивалент инструмента Snipping
- 29. .NET Стандартного эквивалент Thread.CurrentCulture
- 30. .net эквивалент функции Javascript
Прохладный ... сам не знал о методе Escape(); определенно упростит часть моего решения;) – jerryjvl