Add some more substring extension methods

This commit is contained in:
YoshiRulz 2021-05-27 22:08:16 +10:00
parent 2601ad636a
commit 9224a4a81c
No known key found for this signature in database
GPG Key ID: C4DE31C245353FB7
2 changed files with 111 additions and 3 deletions

View File

@ -26,6 +26,18 @@ namespace BizHawk.Common.StringExtensions
/// </returns>
public static string RemovePrefix(this string str, char prefix, string notFoundValue) => str.Length != 0 && str[0] == prefix ? str.Substring(1, str.Length - 1) : notFoundValue;
/// <returns>
/// <paramref name="str"/> with the leading substring <paramref name="prefix"/> removed, or
/// the original <paramref name="str"/> if <paramref name="str"/> does not start with <paramref name="prefix"/>
/// </returns>
public static string RemovePrefix(this string str, string prefix) => str.RemovePrefix(prefix, notFoundValue: str);
/// <returns>
/// <paramref name="str"/> with the leading substring <paramref name="prefix"/> removed, or
/// <paramref name="notFoundValue"/> if <paramref name="str"/> does not start with <paramref name="prefix"/>
/// </returns>
public static string RemovePrefix(this string str, string prefix, string notFoundValue) => str.StartsWith(prefix) ? str.Substring(prefix.Length, str.Length - prefix.Length) : notFoundValue;
/// <returns>
/// <paramref name="str"/> with the last char removed, or
/// the original <paramref name="str"/> if the last char of <paramref name="str"/> is not <paramref name="suffix"/>
@ -35,6 +47,34 @@ namespace BizHawk.Common.StringExtensions
? str.Substring(0, str.Length - 1)
: str;
/// <returns>
/// <paramref name="str"/> with the trailing substring <paramref name="suffix"/> removed, or
/// the original <paramref name="str"/> if <paramref name="str"/> does not end with <paramref name="suffix"/>
/// </returns>
public static string RemoveSuffix(this string str, string suffix) => str.RemoveSuffix(suffix, notFoundValue: str);
/// <returns>
/// <paramref name="str"/> with the trailing substring <paramref name="suffix"/> removed, or
/// <paramref name="notFoundValue"/> if <paramref name="str"/> does not end with <paramref name="suffix"/>
/// </returns>
public static string RemoveSuffix(this string str, string suffix, string notFoundValue) => str.EndsWith(suffix) ? str.Substring(0, str.Length - suffix.Length) : notFoundValue;
/// <returns>
/// the substring of <paramref name="str"/> after the first occurrence of <paramref name="delimiter"/>, or
/// the original <paramref name="str"/> if not found
/// </returns>
public static string SubstringAfter(this string str, string delimiter) => str.SubstringAfter(delimiter, notFoundValue: str);
/// <returns>
/// the substring of <paramref name="str"/> after the first occurrence of <paramref name="delimiter"/>, or
/// <paramref name="notFoundValue"/> if not found
/// </returns>
public static string SubstringAfter(this string str, string delimiter, string notFoundValue)
{
var index = str.IndexOf(delimiter);
return index < 0 ? notFoundValue : str.Substring(index + delimiter.Length, str.Length - index - delimiter.Length);
}
/// <returns>
/// the substring of <paramref name="str"/> before the first occurrence of <paramref name="delimiter"/>, or
/// the original <paramref name="str"/> if not found
@ -51,6 +91,22 @@ namespace BizHawk.Common.StringExtensions
return index < 0 ? notFoundValue : str.Substring(0, index);
}
/// <returns>
/// the substring of <paramref name="str"/> before the last occurrence of <paramref name="delimiter"/>, or
/// the original <paramref name="str"/> if not found
/// </returns>
public static string SubstringBeforeLast(this string str, char delimiter) => str.SubstringBeforeLast(delimiter, notFoundValue: str);
/// <returns>
/// the substring of <paramref name="str"/> before the last occurrence of <paramref name="delimiter"/>, or
/// <paramref name="notFoundValue"/> if not found
/// </returns>
public static string SubstringBeforeLast(this string str, char delimiter, string notFoundValue)
{
var index = str.LastIndexOf(delimiter);
return index < 0 ? notFoundValue : str.Substring(0, index);
}
/// <returns>
/// the substring of <paramref name="str"/> before the first occurrence of <paramref name="delimiter"/>, or
/// <see langword="null"/> if not found

View File

@ -6,6 +6,10 @@ namespace BizHawk.Tests.Common.StringExtensions
[TestClass]
public class StringExtensionTests
{
private const string abcdef = "abcdef";
private const string qrs = "qrs";
[TestMethod]
public void In_CaseInsensitive()
{
@ -21,14 +25,62 @@ namespace BizHawk.Tests.Common.StringExtensions
[TestMethod]
public void TestRemovePrefix()
{
const string abcdef = "abcdef";
const string qrs = "qrs";
Assert.AreEqual("bcdef", abcdef.RemovePrefix('a', qrs));
Assert.AreEqual(string.Empty, "a".RemovePrefix('a', qrs));
Assert.AreEqual(qrs, abcdef.RemovePrefix('c', qrs));
Assert.AreEqual(qrs, abcdef.RemovePrefix('x', qrs));
Assert.AreEqual(qrs, string.Empty.RemovePrefix('a', qrs));
Assert.AreEqual("def", abcdef.RemovePrefix("abc", qrs));
Assert.AreEqual("bcdef", abcdef.RemovePrefix("a", qrs));
Assert.AreEqual(abcdef, abcdef.RemovePrefix(string.Empty, qrs));
Assert.AreEqual(string.Empty, abcdef.RemovePrefix(abcdef, qrs));
Assert.AreEqual(string.Empty, "a".RemovePrefix("a", qrs));
Assert.AreEqual(qrs, abcdef.RemovePrefix("c", qrs));
Assert.AreEqual(qrs, abcdef.RemovePrefix("x", qrs));
Assert.AreEqual(qrs, string.Empty.RemovePrefix("abc", qrs));
}
[TestMethod]
public void TestRemoveSuffix()
{
Assert.AreEqual("abc", abcdef.RemoveSuffix("def", qrs));
Assert.AreEqual("abcde", abcdef.RemoveSuffix("f", qrs));
Assert.AreEqual(abcdef, abcdef.RemoveSuffix(string.Empty, qrs));
Assert.AreEqual(string.Empty, abcdef.RemoveSuffix(abcdef, qrs));
Assert.AreEqual(string.Empty, "f".RemoveSuffix("f", qrs));
Assert.AreEqual(qrs, abcdef.RemoveSuffix("d", qrs));
Assert.AreEqual(qrs, abcdef.RemoveSuffix("x", qrs));
Assert.AreEqual(qrs, string.Empty.RemoveSuffix("def", qrs));
}
[TestMethod]
public void TestSubstringAfter()
{
Assert.AreEqual("def", abcdef.SubstringAfter("bc", qrs));
Assert.AreEqual(abcdef, abcdef.SubstringAfter(string.Empty, qrs));
Assert.AreEqual(string.Empty, abcdef.SubstringAfter(abcdef, qrs));
Assert.AreEqual(string.Empty, abcdef.SubstringAfter("f", qrs));
Assert.AreEqual(string.Empty, "f".SubstringAfter("f", qrs));
Assert.AreEqual("abcdab", "abcdabcdab".SubstringAfter("cd", qrs));
Assert.AreEqual(qrs, abcdef.SubstringAfter("x", qrs));
Assert.AreEqual(qrs, string.Empty.SubstringAfter("abc", qrs));
}
[TestMethod]
public void TestSubstringBefore()
{
Assert.AreEqual("abc", abcdef.SubstringBefore('d', qrs));
Assert.AreEqual(string.Empty, abcdef.SubstringBefore('a', qrs));
Assert.AreEqual(string.Empty, "a".SubstringBefore('a', qrs));
Assert.AreEqual("abc", "abcdabcdab".SubstringBefore('d', qrs));
Assert.AreEqual(qrs, abcdef.SubstringBefore('x', qrs));
Assert.AreEqual(qrs, string.Empty.SubstringBefore('d', qrs));
// fewer tests for SubstringBeforeLast as its implementation should match SubstringBefore, save for using LastIndexOf
Assert.AreEqual("abcdabc", "abcdabcdab".SubstringBeforeLast('d', qrs));
Assert.AreEqual(qrs, "abcdabcdab".SubstringBeforeLast('x', qrs));
}
}
}