【ArcGIS Pro二次开发】(34):从字符串中提取中文、英文、数字与特殊符号

news/2024/11/24 16:46:15/

这是一个基于字段计算的工具。

有时候我们会遇到一些混杂着各种中文、英文、数字、特殊符号的文字,这个工具的目的是从这些复杂文字中提取出想要的特定文字。

比如说从CAD测绘图中可以读取到类似【混3】、【砖2】的文字,如果想要从中提取出层数或结构,就可以用这个工具实现。


一、要实现的功能

如上图所示,点击【提取特定文字】工具,选择地图内的要素图层或独立表,再选择要处理的包含复杂文字的字段和要输出结果的字段,再选择提取模式,点击执行即可。

执行结果如下:

有点像字段计算器计算的结果,实际上用字段计算器也能实现上面的效果,有兴趣的可以看一下这一篇文章:Arcgis小技巧【10】——字段计算器的简单用法和示例


二、实现流程

首先要从当前选择的图层或独立表中获取【Table】,作为后续字段计算的载体。

因为选择的可能是要素图层或者独立表,写了一个通用方法,考虑的比以前要多一些。

        // 从图层获取Tablepublic static Table GetTableFromLayer(string fcPath){// 判断是否选择了图层if (fcPath == ""){MessageBox.Show("请选择一个要素图层或表");return null;}// 根据图层名找到当前图层var map = MapView.Active.Map;var init_featurelayer = map.FindLayers(fcPath);var init_table = map.FindStandaloneTables(fcPath);// 判断当前选择的是要素图层还是独立表if (init_featurelayer.Count == 0){// 是独立表的情况StandaloneTable init_layer = map.FindStandaloneTables(fcPath)[0];return init_layer.GetTable();}if (init_table.Count == 0){// 是要素图层的情况FeatureLayer init_layer = map.FindLayers(fcPath)[0] as FeatureLayer;return init_layer.GetTable();}return null;}

获取到【Table】之后,就可以通过游标进行字段计算了:

                await QueuedTask.Run(() =>{// 获取所选图层的所有字段var tb = ToolManager.GetTableFromLayer(layer_path);// 字段计算using (ArcGIS.Core.Data.Table table = tb){using (RowCursor rowCursor = table.Search(null, false)){TableDefinition tableDefinition = table.GetDefinition();while (rowCursor.MoveNext()){using (Row row = rowCursor.Current){// 获取输入字段的值var value_in = row[field_in].ToString();// 提取特定文字row[field_out] = ToolManager.GetWord(value_in, model);// 保存row.Store();}}}}});

这里的ToolManager.GetWord(value_in, model)方法就是最核心的代码了,主要是通过正则表达式来实现:

        // 提取特定文字【model包括:中文、英文、数字、特殊符号】public static string GetWord(string txt_in, string model = "中文"){string chinesePattern = "[\u4e00-\u9fa5]"; // 匹配中文字符的正则表达式string englishPattern = "[a-zA-Z]"; // 匹配英文字符的正则表达式string digitPattern = @"\d"; // 匹配数字的正则表达式string specialCharPattern = @"[^a-zA-Z0-9\u4e00-\u9fa5\s]"; // 匹配特殊符号的正则表达式string txt = "";if (model == "中文"){Regex chineseRegex = new Regex(chinesePattern);txt = ExtractMatches(txt_in, chineseRegex);}else if (model == "英文"){Regex englishRegex = new Regex(englishPattern);txt = ExtractMatches(txt_in, englishRegex);}else if (model == "数字"){Regex digitRegex = new Regex(digitPattern);txt = ExtractMatches(txt_in, digitRegex);}else if (model == "特殊符号"){Regex specialCharRegex = new Regex(specialCharPattern);txt = ExtractMatches(txt_in, specialCharRegex);}return txt;}// 正则匹配public static string ExtractMatches(string input, Regex regex){string result = "";MatchCollection matches = regex.Matches(input);foreach (Match match in matches){result += match.Value;}return result;}

核心代码并不长,正则表达式之前在python中用过,这次在c#中实现,基本差不多,还是很好用的。


三、工程文件分享

 最后,放上工程文件的链接:

GetWordicon-default.png?t=N4P3https://pan.baidu.com/s/1IJ6qDrMKcZqWCsPceAy5bA?pwd=y1vyPS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。


http://www.ppmy.cn/news/253033.html

相关文章

RK3588平台开发系列讲解(驱动基础篇)信号驱动 IO 实验

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、信号驱动 IO 简介二、实验程序2.1、应用程序2.2、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 信号驱动 IO 不需要应用程序查询设备的状态,一旦设备准备就绪,会触发 SIGIO 信号,进而调用注…

Cracking C++(2): 编译期查询编译器支持的C++标准

文章目录 1. 目的2. 让编译器说出支持的 C 版本3. 通过代码打印 C 版本3.1 打印 __cplusplus 宏AppleClangMSVC 4. 最终代码5. References 1. 目的 在2023年, hackingcpp 推荐用 C20, 至少要用 C17. 那么我的编译器是否支持 C20 或 C17 呢? 怎样查询我…

案例38:基于Springboot电影评论网站开题报告设计

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

聊聊那些奇葩的代码规范 —— 所有 IntelliJ 的警告必须要处理

因为有些要求感觉实是太过奇葩,收集下来娱乐下大家。 代码规范要求 如果代码在 IntelliJ 出现了警告提示,所有的警告必须要在提交之前处理完成,否则 PR 合并全部被拒绝,不管有些警告是不是有点奇葩, 同时&#xff0…

【TCP/IP】基于UDP的服务器端/客户端实现 III - UDP传输特性、连接与未连接UDP套接字的转化

UDP的传输特性 TCP传输的数据不存在数据边界,其表明的意义是“数据传输过程中调用的I/O函数次数对整个流程没有影响(调用多少次对结果不会产生影响)”。那么,在UDP中又是如何呢? 存在数据边界的UDP套接字 UDP是具有数…

AOC u27u2d 和u2720qm的区别 哪个好

示器aoc u27u2d和dell u2720qm区别还是有的,不算很大,都算比较好的啦,比较起来看AOC U27U2D显示器,AOC U27U2D性价比也还可以的,收到了还没来得及测试,先好评,电子产品碰运气,有问题…

AOC 27G2X评测

外观上,AOC 27G2X显示器采用了时下流行的3面窄边框曲面的设计,底部边框的正中为一个AOC的LOGO。面板方面,这款AOC 27G2X显示器采用了1500R的1080p分辨率的VA面板,由三星显示提供,刷新率为60Hz,峰值亮度为30…

测试2k显示器的软件,高性价比的27吋2K显示器 AOC Q27P1U评测

0127英寸屏幕、2K分辨率 对于办公或者普通家用显示器来说,屏幕尺寸、分辨率以及色域相比刷新率更能决定使用体验。从实际的使用环境来说,27英寸的显示器是目前相对比较合适的尺寸,坐在距离显示器60cm左右的地方既不会因为屏幕过大产生眩晕感,也不会因为屏幕过小而无法看清细…