Excel催化剂开源第24波-较VBA更强大的.Net环境的正则表达式

在VBA上可以调用正则表达式库,从而编写正则表达式自定义函数,这个相信不少VBA开发者已经熟知,但VBA的VBScript正则表达式库毕竟是一个过时的产品,不像.Net那样是与时俱进的,所以两者实现出来的正则功能还是有区别的,.Net的正则表达式更为强大和好用,用于开发自定义函数时,若用ExcelDna来开发,就可以用上.Net的正则的强大功能。

在Excel催化剂的自定义函数开源中,已经对代码作了全公开,此处,只是作一些代码的小小讲解,希望对VBA开发者过渡过来的VSTO开发有些帮助。

.Net正则有正则切割函数

正则切割,类似普通文本的split,但其分隔符可以用正则来匹配,是动态的非静态固定值

 /// 
 /// 
 /// 
 /// 
 /// 
 /// 索引从0开始
 /// 
 /// 
 /// 
 /// 
 [ExcelFunction(Category = "文本处理_正则相关", Description = "正则分割,返回多个值。Excel催化剂出品,必属精品!")]
 public static object RegexSplits(
 [ExcelArgument(Description = "输入的字符串")] string input,
 [ExcelArgument(Description = "匹配规则")] string pattern,
 [ExcelArgument(Description = "确定最终返回的数据是以行(H)排列还是以列(L)排列,传入非H字符或不传参数默认为L排列。")] string optAlignHorL = "L",
 [ExcelArgument(Description = "是否编译,是为1,否为0,暂时没有测试过哪个快在数据量大时,文档好像说数据量大用编译比较好,默认为false")] bool isCompiled = false,
 [ExcelArgument(Description = @"用来指定w是否匹配一些特殊编码之类的例如中文,当false时会匹配中文,指定为true时,可能和其他的指定有些冲突,默认为false")] bool isECMAScript = false,
 [ExcelArgument(Description = "从右往左匹配,默认为false")] bool isRightToLeft = false)
 {
 try
 {
 RegexOptions options = GetRegexOptions(isCompiled, isECMAScript, isRightToLeft);
 string[] splitResult = Regex.Split(input, pattern, options);
 return Common.ReturnDataArray(splitResult, optAlignHorL);
 }
 catch (ArgumentOutOfRangeException)
 {
 return "Options错误";
 }
 catch (ArgumentNullException)
 {
 return "";
 }
 catch (ArgumentException)
 {
 return "Pattern错误";
 }
 catch (Exception)
 {
 return input;
 }
 }

有单独的RegexOptions配置类,可丰富地控制正则的配置模式

Excel催化剂开源第24波-较VBA更强大的.Net环境的正则表达式

丰富的配置模式

在配置模式中,用|代表多个选项同时成立。

private static RegexOptions GetRegexOptions(bool isCompiled, bool isECMAScript, bool isRightToLeft)
 {
 List listOptions = new List();
 if (isCompiled == true)
 {
 listOptions.Add(RegexOptions.Compiled);
 }
 if (isRightToLeft == true)
 {
 listOptions.Add(RegexOptions.RightToLeft);
 }
 if (isECMAScript == true)
 {
 listOptions.Add(RegexOptions.ECMAScript);
 }
 RegexOptions options = new RegexOptions();
 foreach (var item in listOptions)
 {
 if (options == 0)
 {
 options = item;
 }
 else
 {
 options = options | item;
 }
 }
 return options;
 }

以上代码发现,没有对常用的区分大小写等选项进行实现,因为在.net里有更强大的方式,可以精确控制选项的作用范围(无需整个匹配都对区分大小写来生效,可精确控制到哪些字符前中后才控制区分大小写等)

Excel催化剂自定义函数只对不能使用内联构造的选项进行参数配置,其他可内联构造的,直接写到Pattern里,即可精确匹配范围,又可在自定义函数最终实现时少写许多的参数。

Excel催化剂开源第24波-较VBA更强大的.Net环境的正则表达式

Excel催化剂自定义函数只对不能使用内联构造的选项进行参数配置

下面的示例使用 i、n 以及 x 选项启用区分大小写和显式捕获,并忽略正则表达式中间的正则表达式模式中的空白。
using System;
using System.Text.RegularExpressions;
public class Example
{
 public static void Main()
 {
 string pattern; 
 string input = "double dare double Double a Drooling dog The Dreaded Deep";
 pattern = @"b(Dw+)s(dw+)b";
 // Match pattern using default options.
 foreach (Match match in Regex.Matches(input, pattern))
 {
 Console.WriteLine(match.Value);
 if (match.Groups.Count > 1)
 for (int ctr = 1; ctr < match.Groups.Count; ctr++) 
 Console.WriteLine(" Group {0}: {1}", ctr, match.Groups[ctr].Value);
 }
 Console.WriteLine();
 // Change regular expression pattern to include options.
 pattern = @"b(Dw+)(?ixn) s (dw+) b";
 // Match new pattern with options. 
 foreach (Match match in Regex.Matches(input, pattern))
 {
 Console.WriteLine(match.Value);
 if (match.Groups.Count > 1)
 for (int ctr = 1; ctr < match.Groups.Count; ctr++) 
 Console.WriteLine(" Group {0}: '{1}'", ctr, match.Groups[ctr].Value);
 }
 }
}
// The example displays the following output:
// Drooling dog
// Group 1: Drooling
// Group 2: dog
// 
// Drooling dog
// Group 1: 'Drooling'
// Dreaded Deep
// Group 1: 'Dreaded'
该示例定义两个正则表达式。 第一个 b(Dw+)s(dw+)b,匹配以大写的“D”和小写“d”开头的两个连续单词。 第二个的正则表达式 b(Dw+)(?ixn) s (dw+) b,使用内联选项来修改此模式,如下表所述。 结果的比较可以确定 (?ixn) 构造的效果。

关于内联构造的进一步学习可到官方文档中学习,非常详细。

其他构造 | Microsoft Docs https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-4.0/x044wc7s(v=vs.100)

结语

让.Net的强大威力,接入到Excel中使用,例如正则表达式,是一个非常不错的路径去增强Excel现有功能。

在Excel催化剂里,大量外部的力量来加强Excel自身无法实现的功能,后面陆续给大家推送一些笔者发现的很不错的轮子,不局限在.Net的现成类库还有其他外部专业程序猿写的类库轮子,供大家使用,带来代码的更大便利性。

展开阅读全文

页面更新:2024-04-21

标签:催化剂   内联   正则   轮子   大小写   函数   精确   排列   选项   强大   参数   模式   代码   功能   环境   数据   数码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top