从心莱克 发表于 2021-12-22 05:10:32

恒之以持 发表于 2021-12-29 21:19:11

我终于看到正则出现在函数公式里了。请问你里面的代码主要作用就是用来支持正则的?
我公司这里是内部电脑和内部网络,我们没法自己安装任何东西,包括插件,所以我只能依靠VBA、函数、批处理来提升效率。
十分感谢,你的公式是我新世界的大门,虽然还看不懂

夢過留痕 发表于 2021-12-31 08:11:39

是的,其中的代码就只包含一个自定义函数:REGREPLACE,它利用VBSCript.RegExp正则表达式的替换功能来提取想要的目标字符。
这个函数的核心是编写正则表达式。
很多人认为正则表达式很难懂,很不好编写。因此,我做的VBA加载宏工具里面,提供了一个“正则表达式助手”,让大家只需要会编写最简单的正则表达式,就可以利用该“助手”生成各种具有复杂匹配功能的正则表达式。
就本例,我说明一下正则表达式编写的技巧方法:就像我的第一个回复中的动图演示的那样,分析目标字符及其前缀、后缀以及干扰项的特征。
本例的目标字符:
它是多个非空白的字符,表示为 \S+,又因为此项是目标字符,所以点击输入框右边的按钮,就自动为它外加一对表示捕获分组的圆括号,成为:(\S+)
前缀:
由于目标字符是管径或带帽螺栓的规格,因此需要用前缀字母 DN或M来表示这两种规格数据,表示为:DN|M。
而前缀并不是最终要提取的目标字符,而且又分成了两种情况,因此需要组合起来成为一个整体,这就需要以“非捕获”的分组形式 (?:)将其括起来,即:(?:DN|M)
显然,表示这两种规格的字母DN和M不能是其它单词的内部字符,它的左边必须是单词的边界,因此需要在左边加上一个表示单词边界的符号\b,这样,前缀就表示为:\b(?:DN|M)
又,此前用“多个非空白字符”来描述两种规格数据的目标字符,显然是不够准确的,因为各种汉字、字母、标点符号都是非空白字符,而表示规格的数据显然需要以一个数字字符开始,所以把前面的(\S+)改成(\d\S*),后者的含义是:一个数字字符后紧接任意多个非空白字符。
这样一来,就描述了:以DN或M开头,后面紧接一个数字和任意多个非空白字符。
显然,上述特征描述,已经足够准确地从源字符串中把目标字符区分出来了。
最后,在正则表达式助手中,点击“完成编写”按钮,此工具会把表示前缀和目标字符的两部分表达式代入我总结的正则表达式万能公式中,生成最终的正则表达式:
[\d\D]*?\b(?:DN|M)(\d\S*)|[\d\D]+
上一个回复的附件中,所编写的公式里所用到的正则表达式就是上述表达式。
在此,特别推荐我的“正则表达式助手”:
它把复杂的正则表达式 清晰地划分成 7个基本部分,其中有两个部分是固定的,而其它5个部分,只需要按标签说明编写出对应的基本表达式。如果这5项中的某项字符特征不做要求,就保持为空,如本例中就只需要填写2项,其余的3项都保留为空),然后点按钮就可自动生成完整的表达式。有了这个助手,即使是正则表达式入门级新手,也可以准确地编写出能匹配复杂特征的正则表达式!

一个萝卜一个坑儿 发表于 2022-1-3 21:52:02

我公司电脑无法安装插件,但是这个自定义函数代码可以用。十分感谢大神,有了这个代码,我可以把工作模板变得更加强大。解释的也很清晰,我现在能看懂,不过当时学的时候还是挺困难的。

汉堡侃世界 发表于 2022-1-4 12:12:39

上传附件,说明需求,模拟结果

立川 发表于 2022-1-4 20:00:02

VBA正则可以
pattern="(?<=DN)\S+"
或pattern="DN\S+"

十指 发表于 2022-1-4 20:19:58

华北奇石 发表于 2022-1-5 22:30:13

=TRIM(LEFT(SUBSTITUTE(MID(A1,FIND("DN",A1)+2,99)," ",REPT(" ",99)),50))

雨落弦断 发表于 2022-1-8 19:47:35

感谢大神,没看懂99和50的意义,我去学习一下

走了你还有谁 发表于 2022-1-18 15:53:19

上传附件,说明需求,模拟结果
页: 1 [2] 3 4
查看完整版本: 【已解决】提取指定字符后及其之后第一个空格之间的字符