mirror of
https://github.com/nsnail/ns-ext.git
synced 2025-12-27 01:55:48 +08:00
<refactor>
This commit is contained in:
@@ -1,41 +1,26 @@
|
||||
// ReSharper disable UnusedMember.Global
|
||||
// ReSharper disable MemberCanBePrivate.Global
|
||||
|
||||
|
||||
#pragma warning disable CA1720
|
||||
using System.Security.Cryptography;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace NSExt.Extensions;
|
||||
|
||||
public static class StringExtensions
|
||||
/// <summary>
|
||||
/// StringExtensions
|
||||
/// </summary>
|
||||
public static partial class StringExtensions
|
||||
{
|
||||
private static readonly JsonSerializerOptions _defaultJsonSerializerOptions
|
||||
= default(JsonSerializerOptions).NewJsonSerializerOptions();
|
||||
|
||||
/// <summary>
|
||||
/// MD5 hmac编码
|
||||
/// </summary>
|
||||
/// <param name="me">字符串</param>
|
||||
/// <param name="key">密钥</param>
|
||||
/// <param name="e">字符串使用的编码</param>
|
||||
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
||||
private static string Md5Hmac(this string me, string key, Encoding e)
|
||||
{
|
||||
using var md5Hmac = new HMACMD5(e.GetBytes(key));
|
||||
return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me)))
|
||||
.Replace("-", string.Empty)
|
||||
.ToLower(CultureInfo.CurrentCulture);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// aes加密
|
||||
/// </summary>
|
||||
/// <param name="me">要加密的串</param>
|
||||
/// <param name="key">密钥</param>
|
||||
/// <param name="cipherMode">指定要用于加密的块密码模式。</param>
|
||||
/// <param name="paddingMode">指定在消息数据块短于加密操作所需的完整字节数时要应用的填充类型。</param>
|
||||
/// <returns></returns>
|
||||
public static string Aes(this string me, string key, CipherMode cipherMode = CipherMode.ECB
|
||||
, PaddingMode paddingMode = PaddingMode.PKCS7)
|
||||
public static string Aes(this string me, string key)
|
||||
{
|
||||
using var aes = System.Security.Cryptography.Aes.Create();
|
||||
aes.Padding = PaddingMode.PKCS7;
|
||||
@@ -47,17 +32,12 @@ public static class StringExtensions
|
||||
return decrypted.Base64();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// aes解密
|
||||
/// </summary>
|
||||
/// <param name="me">要加密的串</param>
|
||||
/// <param name="key">密钥</param>
|
||||
/// <param name="cipherMode">指定要用于加密的块密码模式。</param>
|
||||
/// <param name="paddingMode">指定在消息数据块短于加密操作所需的完整字节数时要应用的填充类型。</param>
|
||||
/// <returns></returns>
|
||||
public static string AesDe(this string me, string key, CipherMode cipherMode = CipherMode.ECB
|
||||
, PaddingMode paddingMode = PaddingMode.PKCS7)
|
||||
public static string AesDe(this string me, string key)
|
||||
{
|
||||
using var aes = System.Security.Cryptography.Aes.Create();
|
||||
aes.Padding = PaddingMode.PKCS7;
|
||||
@@ -98,13 +78,12 @@ public static class StringExtensions
|
||||
/// <returns>解码后的原始字符串</returns>
|
||||
public static string Base64De(this string me, Encoding e)
|
||||
{
|
||||
return e.GetString(Base64De(me));
|
||||
return e.GetString(me.Base64De());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将易于web传输的base64web字符串转换为原生base64
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns>原生base64</returns>
|
||||
public static string Base64Sys(this string me)
|
||||
{
|
||||
@@ -114,7 +93,6 @@ public static class StringExtensions
|
||||
/// <summary>
|
||||
/// 将原生base64字符串转换成易于web传输的字符串
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns>易于web传输的字符串</returns>
|
||||
public static string Base64Web(this string me)
|
||||
{
|
||||
@@ -156,7 +134,6 @@ public static class StringExtensions
|
||||
: ret;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串转换成日期对象
|
||||
/// </summary>
|
||||
@@ -178,7 +155,6 @@ public static class StringExtensions
|
||||
return decimal.Parse(me, CultureInfo.CurrentCulture);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 尝试将字符串转为decimal
|
||||
/// </summary>
|
||||
@@ -190,7 +166,6 @@ public static class StringExtensions
|
||||
return !decimal.TryParse(me, out var ret) ? def : ret;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// string to double
|
||||
/// </summary>
|
||||
@@ -204,23 +179,17 @@ public static class StringExtensions
|
||||
/// <summary>
|
||||
/// 将字符串转换成枚举对象
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="name"></param>
|
||||
/// <returns></returns>
|
||||
public static T Enum<T>(this string name) where T : Enum
|
||||
public static T Enum<T>(this string name)
|
||||
where T : Enum
|
||||
{
|
||||
return (T)System.Enum.Parse(typeof(T), name, true);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串转换成枚举对象
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="name"></param>
|
||||
/// <param name="def"></param>
|
||||
/// <returns></returns>
|
||||
public static T EnumTry<T>(this string name, T def) where T : Enum
|
||||
public static T EnumTry<T>(this string name, T def)
|
||||
where T : Enum
|
||||
{
|
||||
return !System.Enum.TryParse(typeof(T), name, out var ret) ? def : (T)ret;
|
||||
}
|
||||
@@ -235,12 +204,10 @@ public static class StringExtensions
|
||||
return float.Parse(me, CultureInfo.CurrentCulture);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串转为guid
|
||||
/// </summary>
|
||||
/// <param name="me">字符串</param>
|
||||
/// <returns></returns>
|
||||
public static Guid Guid(this string me)
|
||||
{
|
||||
return System.Guid.Parse(me);
|
||||
@@ -251,13 +218,11 @@ public static class StringExtensions
|
||||
/// </summary>
|
||||
/// <param name="me">字符串</param>
|
||||
/// <param name="def">转换失败的返回值</param>
|
||||
/// <returns></returns>
|
||||
public static Guid Guid(this string me, Guid def)
|
||||
{
|
||||
return System.Guid.TryParse(me, out var ret) ? ret : def;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串转换成字节数组形式
|
||||
/// </summary>
|
||||
@@ -279,11 +244,10 @@ public static class StringExtensions
|
||||
return me.Hex(Encoding.UTF8);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 对一个字符串进行sha1 hash运算
|
||||
/// </summary>
|
||||
/// <param name="me">对一个字符串进行sha1 hash运算</param>
|
||||
/// <param name="me">me</param>
|
||||
/// <param name="secret">密钥</param>
|
||||
/// <param name="e">使用的编码</param>
|
||||
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
||||
@@ -299,8 +263,6 @@ public static class StringExtensions
|
||||
/// <summary>
|
||||
/// html编码
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static string Html(this string me)
|
||||
{
|
||||
return HttpUtility.HtmlEncode(me);
|
||||
@@ -337,7 +299,6 @@ public static class StringExtensions
|
||||
return !int.TryParse(me, out var ret) ? def : ret;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// string to Int64
|
||||
/// </summary>
|
||||
@@ -362,43 +323,43 @@ public static class StringExtensions
|
||||
/// <summary>
|
||||
/// ipv4格式转int32格式
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static int IpV4ToInt32(this string me)
|
||||
{
|
||||
return BitConverter.ToInt32(me.Split('.').Select(byte.Parse).Reverse().ToArray(), 0);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 是否base64字符串
|
||||
/// </summary>
|
||||
/// <param name="me">字符串</param>
|
||||
/// <returns></returns>
|
||||
public static bool IsBase64String(this string me)
|
||||
{
|
||||
// 一个合法的Base64,有着以下特征:
|
||||
// 字符串的长度为4的整数倍。
|
||||
// 字符串的符号取值只能在A -Z, a -z, 0 -9, +, /, =共计65个字符中,且 = 如果出现就必须在结尾出现。
|
||||
if (!me.All(x => x.IsBase64Character())) return false;
|
||||
if (me.Length % 4 != 0) return false;
|
||||
if (!me.All(x => x.IsBase64Character())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (me.Length % 4 != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var firstEqualSignPos = me.IndexOf('=');
|
||||
if (firstEqualSignPos < 0) return true;
|
||||
if (firstEqualSignPos < 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
var lastEqualSignPos = me.LastIndexOf('=');
|
||||
return lastEqualSignPos == me.Length - 1 && me[firstEqualSignPos..lastEqualSignPos].All(x => x == '=');
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 中文姓名打马赛克
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static string MaskChineseName(this string me)
|
||||
{
|
||||
if (me.Length == 2) return "*" + me[1..];
|
||||
|
||||
return me[..1] + "*" + me[^1..];
|
||||
return me.Length == 2 ? "*" + me[1..] : me[..1] + "*" + me[^1..];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -408,10 +369,9 @@ public static class StringExtensions
|
||||
/// <returns>掩码后的手机号</returns>
|
||||
public static string MaskMobile(this string me)
|
||||
{
|
||||
return new Regex(@"^(\d{3})\d{4}(\d{4})$").Replace(me, "$1****$2");
|
||||
return MyRegex().Replace(me, "$1****$2");
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 对一个字符串进行md5hash运算
|
||||
/// </summary>
|
||||
@@ -420,8 +380,7 @@ public static class StringExtensions
|
||||
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
||||
public static string Md5(this string me, Encoding e)
|
||||
{
|
||||
using var md5 = MD5.Create();
|
||||
return BitConverter.ToString(md5.ComputeHash(e.GetBytes(me)))
|
||||
return BitConverter.ToString(MD5.HashData(e.GetBytes(me)))
|
||||
.Replace("-", string.Empty)
|
||||
.ToLower(CultureInfo.CurrentCulture);
|
||||
}
|
||||
@@ -437,12 +396,9 @@ public static class StringExtensions
|
||||
return me.AsEnumerable().NullOrEmpty() ? defVal : me;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// null或空白字符
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static bool NullOrWhiteSpace(this string me)
|
||||
{
|
||||
return string.IsNullOrWhiteSpace(me);
|
||||
@@ -459,7 +415,6 @@ public static class StringExtensions
|
||||
return JsonSerializer.Deserialize<T>(me, options ?? _defaultJsonSerializerOptions);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 反序列化一个文件获得指定类型的数据对象
|
||||
/// </summary>
|
||||
@@ -472,7 +427,6 @@ public static class StringExtensions
|
||||
return JsonSerializer.Deserialize(me, type, options ?? _defaultJsonSerializerOptions);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 生成密码
|
||||
/// </summary>
|
||||
@@ -490,20 +444,17 @@ public static class StringExtensions
|
||||
/// <returns>处理之后的字符串</returns>
|
||||
public static string RemoveHtmlTag(this string me)
|
||||
{
|
||||
return new Regex(@"<[^>]*>").Replace(me, "");
|
||||
return MyRegex1().Replace(me, string.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除换行符
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static string RemoveWrapped(this string me)
|
||||
{
|
||||
return me.Replace("\r", "").Replace("\n", "");
|
||||
return me.Replace("\r", string.Empty).Replace("\n", string.Empty);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 对一个字符串进行sha1 hash运算
|
||||
/// </summary>
|
||||
@@ -512,42 +463,34 @@ public static class StringExtensions
|
||||
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
||||
public static string Sha1(this string me, Encoding e)
|
||||
{
|
||||
using var sha1 = SHA1.Create();
|
||||
return BitConverter.ToString(sha1.ComputeHash(e.GetBytes(me)))
|
||||
return BitConverter.ToString(SHA1.HashData(e.GetBytes(me)))
|
||||
.Replace("-", string.Empty)
|
||||
.ToLower(CultureInfo.CurrentCulture);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 蛇形命名
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static string Snakecase(this string me)
|
||||
{
|
||||
return Regex.Replace(me, "([A-Z])", "-$1").ToLower().TrimStart('-');
|
||||
return MyRegex2().Replace(me, "-$1").ToLower(CultureInfo.InvariantCulture).TrimStart('-');
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 截取指定长度的字符串,代替substring
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <param name="startIndex"></param>
|
||||
/// <param name="length"></param>
|
||||
/// <returns></returns>
|
||||
public static string Sub(this string me, int startIndex, int length)
|
||||
{
|
||||
if (startIndex + length > me.Length) length = me.Length - startIndex;
|
||||
if (startIndex + length > me.Length) {
|
||||
length = me.Length - startIndex;
|
||||
}
|
||||
|
||||
return me.Substring(startIndex, length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 纯文本字符串转html
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static string Text2Html(this string me)
|
||||
{
|
||||
return $"<pre>{me}</pre>";
|
||||
@@ -556,15 +499,13 @@ public static class StringExtensions
|
||||
/// <summary>
|
||||
/// 将连续多个空格替换成一个空格
|
||||
/// </summary>
|
||||
/// <param name="me"></param>
|
||||
/// <returns></returns>
|
||||
public static string TrimSpaces(this string me)
|
||||
{
|
||||
var ret = me.Replace(" ", " ");
|
||||
// ReSharper disable once TailRecursiveCall
|
||||
return ret == me ? ret : TrimSpaces(ret);
|
||||
}
|
||||
|
||||
// ReSharper disable once TailRecursiveCall
|
||||
return ret == me ? ret : ret.TrimSpaces();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// url编码
|
||||
@@ -585,4 +526,28 @@ public static class StringExtensions
|
||||
{
|
||||
return Uri.UnescapeDataString(me);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MD5 hmac编码
|
||||
/// </summary>
|
||||
/// <param name="me">字符串</param>
|
||||
/// <param name="key">密钥</param>
|
||||
/// <param name="e">字符串使用的编码</param>
|
||||
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
||||
private static string Md5Hmac(this string me, string key, Encoding e)
|
||||
{
|
||||
using var md5Hmac = new HMACMD5(e.GetBytes(key));
|
||||
return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me)))
|
||||
.Replace("-", string.Empty)
|
||||
.ToLower(CultureInfo.CurrentCulture);
|
||||
}
|
||||
|
||||
[GeneratedRegex("^(\\d{3})\\d{4}(\\d{4})$")]
|
||||
private static partial Regex MyRegex();
|
||||
|
||||
[GeneratedRegex("<[^>]*>")]
|
||||
private static partial Regex MyRegex1();
|
||||
|
||||
[GeneratedRegex("([A-Z])")]
|
||||
private static partial Regex MyRegex2();
|
||||
}
|
||||
Reference in New Issue
Block a user