using System.IO; using System.Text.RegularExpressions; using UnityEditor; using UnityEngine; using XGame.Editor.Asset; namespace FL.Editor.Tests { public static class TestString { [MenuItem("Test/String/DeSerialization")] public static void DeSerialization() { var filePath = PathDefine.DefaultOutputPath + "/config.bytes"; if (!File.Exists(filePath)) { return; } //FileStream fileStream = File.OpenRead(filePath); var text = File.ReadAllText(filePath); const char openBracket = '['; const char closeBracket = ']'; const char openBrace = '{'; const char closeBrace = '}'; Regex regex = new Regex(@"Config/(.+?)\.json"); var result = regex.Matches(text); var regCount = result.Count; Debug.Log($"Regex count:{regCount}"); for(var regIdx = 0; regIdx < regCount; regIdx++) { var match = result[regIdx]; Debug.Log($"match:{match.Value} index:{match.Index} value1:{match.Groups[1].Value}"); var startIndex = match.Index + match.Value.Length; var openBracketIdx = text.IndexOf(openBracket, startIndex); var openBraceIdx = text.IndexOf(openBrace, startIndex); //两个值取小的 var openIdx = openBracketIdx < openBraceIdx ? openBracketIdx : openBraceIdx; var closeChar = openBracketIdx < openBraceIdx ? closeBracket : closeBrace; int closeIdx; if (regIdx < regCount - 1) { // var nextMatch = result[regIdx + 1]; closeIdx = text.IndexOfReverse(closeChar, nextMatch.Index - 1); } else { //最后一个json closeIdx = text.IndexOfReverse(closeChar); } if (closeIdx <= openIdx) { Debug.LogError($"字符串匹配错误: Match:{match} Index:{match.Index} Open:{openIdx} Close:{closeIdx}"); continue; } var json = text.Substring(openIdx, closeIdx - openIdx + 1); var jsonPath = $"{PathDefine.DefaultOutputPath}/{match.Value}"; var jsonDir = Path.GetDirectoryName(jsonPath); if (!Directory.Exists(jsonDir)) { Directory.CreateDirectory(jsonDir); } File.WriteAllText(jsonPath, json); } } /// /// 反向查找指定字符的索引 /// /// /// /// 小于零或者大于字符串长度,则从字符串最后一个字符开始查找 /// private static int IndexOfReverse(this string text, char @char, int startIndex = -1) { if (startIndex < 0 || startIndex > text.Length - 1) { startIndex = text.Length - 1; } for(var index = startIndex; index >= 0; index--) { if (@char == text[index]) { return index; } } return -1; } } }