资讯动态

VB.NET实战:解析并对比跨作品角色强度标签

发布时间:2026/9/5 17:04:20 来源:尧图企业网站定制
刚开始看这个标题很容易被“爱丽丝×甘恩”“黑暗塔”“神秘博士×DC”这些关键词带走注意力。但如果把这一行当成一段待清洗的文本你会发现它其实是一个很有意思的数据解析问题一段话里同时包含了参与方、作品来源、强度等级、括号注释、交叉作品关系。想让程序自动判断谁占优难点从来不是“谁更强”而是怎么把非结构化的标题解析成程序能比较的结构化数据。本文用 Visual BasicVB / VB.NET来实现一个“VB标准”解析与对比工具先把原始标题拆成角色主体、作品来源、强度标签再把“高1A”“1B”这类标签转成同一套可比较的规则最后通过命令行和 WinForms 两种方式验证。读完你不但能跑通一个完整示例还会理解这类“看似一句话”的数据为什么要先建模再做比较。1. 这篇文章真正要解决的问题如果你只是用文本编辑器打开一个标题会觉得很自然左侧是爱丽丝×甘恩右侧是博士×至暗骑士括号里是作品来源中间用“vs”连接。但让计算机处理时问题立刻变多“爱丽丝×甘恩”中间的“×”表示组合关系不是乘法也不是“更强”的语义。“博士 1B×至暗骑士 高1A”里到底是一个角色带两个标签还是两个角色各自带标签“高1A”在字符串排序上并不一定排在“1B”后面。括号出现在不同位置程序怎么知道它是作品来源还是对标签的补充说明这些问题不是某一种特定标题独有的。只要是跨世界观的角色比较、版本比较、榜单排名都会遇到“字段边界不清、修饰词含义不统一、等级体系乱”的情况。不要急着写一个if left right的暴力判断而是要先回答三件事什么样的信息要进入数据模型“标准”在这个项目里具体指什么不同标签之间如何转成同一个数值坐标这篇文章会把这三个问题都落地成 VB / VB.NET 代码。你不需要对角色背景有深入研究也不需要认可具体比较结果只要把它当成一个“基于规则解析的中文文本项目”来跑通就行。适合阅读这篇文章的读者包括四类人想用 VB / VB.NET 做文本解析或爬虫数据处理的人。需要给榜单、评分、等级类数据设计标准模型的开发者。遇到“同名字段不同来源、同类型数据不同口径”的数据工程新人。单纯想拿一个有趣案例练手 WinForms 和正则表达式的人。2. 核心概念跨作品强度标签与“标准”的含义2.1 “VB标准”中的 VB 是什么意思标题里出现“『VB标准』”这四个字在不同语境下有不同理解。玩游戏圈或者跨作品对战讨论的人可能把它理解成某类“战力评分标准”而做桌面开发的人看到 VB首先会想到 Visual Basic。本文不纠结这个缩写到底来自哪个圈子而是采用一个更工程化的解释无论规则来自哪套体系只要最终能把“谁比谁强”翻译成程序里的确定性规则它就是可执行的“标准”。在代码里“标准”至少应该包含三层数据标准字段有哪些字段边界是什么。解析标准遇到中文括号、英文括号、空格、×、、高这些符号时怎么处理。比较标准同类标签按什么顺序比较不同类标签是否可比较。有标准程序才能稳定运行。没有标准今天能跑通换一条新标题就会崩。2.2 等级标签常见组成“高1A”“1B”这类标签在选手榜和虚拟对战讨论中非常常见。它们通常不是纯数字而是由多个部分拼起来组成部分示例说明主档位1A、1B表示大的强度区间高位修饰高表示高一个级别或同档上限同档修饰表示同主档位里更高跨作品连接符×表示角色或作品组合不参与数值计算容易踩坑的是很多人会直接拿字符串排序去比“高1A”和“1B”。字符串按字符逐个比较“1B”的开头“1”和“1A”一样但第二位“B”大于“A”所以“1B”在字符串顺序上会排在“1A”后面。可如果按强度理解“1A”通常高于“1B”这时候字典序结果和强度结果正好相反。因此不能直接String.Compare必须先解析成结构化的TierInfo再按自己定义的权重比较。2.3 跨作品比较的前提先做规范化每个作品都有自己的世界观基准。有的作品里面“爆星”很常见有的作品里“爆楼”已经是天花板。跨作品比较时争议往往来自“参照物不同”。对应到数据工程里就是要做规范化normalization。举例同一角色不同版本漫画版、动画版、游戏版、小说版应当拆成不同的记录而不是混在一个对象里。同一作品不同阶段前期、中期、完全体应当允许挂多条等级记录。不同来源的标签High 1A和高1A在语义上更接近而不是把英文字符串和中文串当成完全无关东西。在这篇文章的示例里我不会去定义一套真实可用的“全作品无敌排名”因为那需要维护大量事实数据。我只把规则限定在解析和比较层面你传入什么样的映射表程序就用什么样的标准输出。这样既保证了示例完整也避免越界声称程序真的能解决所有跨作品争论。3. 对象模型从标题中提取结构化信息3.1 字段设计先把一条对战标题拆成下面的字段。字段示例取值意思RawText爱丽丝×甘恩 高1A黑暗灵魂×黑暗塔输入原样便于回溯Name爱丽丝×甘恩参战主体可能是组合角色Verse黑暗灵魂×黑暗塔括号里的作品来源TierLabel高1A原始强度标签这里不要把“×”拆掉之后就扔掉。对于组合角色来说爱丽丝×甘恩说明这场战斗是两名角色一起出现对于组合宇宙来说黑暗灵魂×黑暗塔说明采用了多个作品背景。保留原始文本很重要否则后续要排查解析错误时没法回到源头。3.2 一条标题如何拆解输入标题『VB标准』爱丽丝×甘恩 高1A黑暗灵魂×黑暗塔 vs 博士 1B×至暗骑士 高1A神秘博士×DC先按“vs”切成两段。注意“vs”前后可能有空格、全角空格因此切分时要做 Trim。左侧段爱丽丝×甘恩 高1A黑暗灵魂×黑暗塔右侧段博士 1B×至暗骑士 高1A神秘博士×DC然后去掉括号留下主体爱丽丝×甘恩 高1A 博士 1B×至暗骑士 高1A这时用正则表达式去匹配高?1[A-Z]\?可以把高1A、1B这类标签先提出来。右侧的“博士 1B×至暗骑士 高1A”存在歧义。如果设计者认为博士是“1B”至暗骑士是“高1A”那就应该把角色拆成两行而不是把两个等级塞在同一个字段。真正进入数据库时我会建议改为博士 1B神秘博士×DC 至暗骑士 高1A神秘博士×DC这样才符合一条记录对应一个主体的规范。这个例子也说明解析器能解决一部分问题但数据源头保持干净更重要。3.3 中间数据结果预览解析完成后得到的数据可以这样表示{ left: { name: 爱丽丝×甘恩, verse: 黑暗灵魂×黑暗塔, tier: 高1A }, right: { name: 博士, verse: 神秘博士×DC, tier: 1B } }实际项目中使用 JSON、数据库表或内存对象都可以。核心点是经过解析后“谁vs谁”从一段文本变成了可以检索的字段。4. VB.NET 解析器实现4.1 环境准备本文示例使用 VB.NET 控制台工程。版本选择上使用 Visual Studio 2019/2022 或对应的 .NET SDK 均可如果你习惯命令行可以用下面命令创建工程dotnet new console -lang VB -n VBTierDemo cd VBTierDemo代码逻辑不依赖某个具体框架版本老一点的 .NET Framework 4.x 工程同样可以运行只需把代码复制到Program.vb并自行补齐工程文件即可。4.2 完整的解析器代码下面代码实现三件事使用正则提取括号中的作品来源。去掉括号后使用正则提取强度标签。把主体名称取出来。 File: Program.vb Imports System.Text.RegularExpressions Public Class EntryInfo Public Property Name As String Public Property Verse As String Public Property TierLabel As String End Class Public Module EntryParser Public Function Parse(raw As String) As EntryInfo Dim result As New EntryInfo() raw raw.Trim() 1. 提取括号里的作品来源兼容中英文括号 Dim versePattern As String [(]([^)])[)] Dim verseMatch As Match Regex.Match(raw, versePattern) If verseMatch.Success Then result.Verse verseMatch.Groups(1).Value End If 2. 去掉括号避免括号内容影响等级识别 Dim clean As String Regex.Replace(raw, versePattern, ) 3. 识别 高1A / 1B 这类标签 规则可选的“高”然后是数字1再是一个大写字母最后是可选的 Dim tierPattern As String 高?1[A-Z]\? Dim tierMatch As Match Regex.Match(clean, tierPattern) If tierMatch.Success Then result.TierLabel tierMatch.Value result.Name clean.Substring(0, tierMatch.Index).Trim() Else result.Name clean.Trim() result.TierLabel 未识别 End If Return result End Function End Module Module Program Sub Main() Dim title As String 『VB标准』爱丽丝×甘恩 高1A黑暗灵魂×黑暗塔 vs 博士 1B×至暗骑士 高1A神秘博士×DC Console.WriteLine(原始输入 title) Console.WriteLine() 按“vs”分割左右两方 Dim sides As String() title.Split(New String() { vs }, StringSplitOptions.RemoveEmptyEntries) For i As Integer 0 To sides.Length - 1 Dim info As EntryInfo EntryParser.Parse(sides(i)) Console.WriteLine(第 (i 1).ToString() 方) Console.WriteLine( 主体 info.Name) Console.WriteLine( 来源 info.Verse) Console.WriteLine( 档次 info.TierLabel) Console.WriteLine() Next Console.WriteLine(解析完成

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价