Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 对用户定义函数的轻微调整_Regex_Excel_User Defined Functions_Udf_Vba - Fatal编程技术网

Regex 对用户定义函数的轻微调整

Regex 对用户定义函数的轻微调整,regex,excel,user-defined-functions,udf,vba,Regex,Excel,User Defined Functions,Udf,Vba,我想从excel中一列中的较大字符串中提取文本和数字的组合 我必须处理的常量是,每个文本字符串 •以a、C或S开头,以及 •长度始终为7个字符 •我想提取的线的位置不同 我一直在使用的有效工作的代码是 Public Function Xtractor(r As Range) As String Dim a, ary ary = Split(r.Text, " ") For Each a In ary If Len(a) = 7 And a Like "[SAC]*" Th

我想从excel中一列中的较大字符串中提取文本和数字的组合

我必须处理的常量是,每个文本字符串

•以a、C或S开头,以及 •长度始终为7个字符 •我想提取的线的位置不同

我一直在使用的有效工作的代码是

Public Function Xtractor(r As Range) As String
Dim a, ary
ary = Split(r.Text, " ")
    For Each a In ary
        If Len(a) = 7 And a Like "[SAC]*" Then
            Xtractor = a
            Exit Function
        End If
    Next a
Xtractor = ""
End Function
然而,今天我了解到,有时我的数据可能包括这样的场景

我想修改我的代码,因此如果第8个字符是“下划线”,而7个字符中的第一个字符是S、A或C,请提取到“下划线”

第二,我想排除像“支持”和“收集”这样的常用词

最后,第七个字母应该是一个数字

任何关于这方面的想法都将不胜感激


感谢将Microsoft VBScript正则表达式5.5添加到项目参考中。使用以下代码测试与Xtractor的匹配和提取:

Public Function Xtractor(ByVal p_val As String) As String
  Xtractor = ""
  Dim ary As String, v_re As New VBScript_RegExp_55.RegExp, Matches
  v_re.Pattern = "^([SAC][^_]{1,6})_?"
  Set Matches = v_re.Execute(p_val)
  If Matches.Count > 0 Then Xtractor = Matches(0).SubMatches(0) Else Xtractor = ""
End Function
Sub test_Xtractor(p_cur As Range, p_val As String, p_expected As String)
  Dim v_cur As Range, v_res As Range
  p_cur.Value = p_val
  Set v_cur = p_cur.Offset(columnOffset:=1)
  v_cur.FormulaR1C1 = "='" & ThisWorkbook.Name & "'!Xtractor(RC[-1])"
  Set v_res = v_cur.Offset(columnOffset:=1)
  v_res.FormulaR1C1 = "=RC[-1]=""" & p_expected & """"
  Debug.Print p_val; "->"; v_cur.Value; ":"; v_res.Value
End Sub
Sub test()
  test_Xtractor ActiveCell, "A612002_MDC_308", "A612002"
  test_Xtractor ActiveCell.Offset(1), "B612002_MDC_308", ""
  test_Xtractor ActiveCell.Offset(2), "SUTP038_MDC_3", "SUTP038"
  test_Xtractor ActiveCell.Offset(3), "KUTP038_MDC_3", ""
End Sub
选择用于编写测试夹具的工作簿和单元格,然后从VBA编辑器中运行
test

立即窗口中的输出(Ctrl+G):

UPD

如果第7个字符是一个返回空白的字母,是否可以将此代码重新编码

将行替换为分配给
v\u re
,方法如下:

v_re.Pattern = "^([SAC](?![^_]{5}[A-Z]_?)[^_]{1,6})_?"
v_re.IgnoreCase = True
并添加到
测试
套件:

test_Xtractor ActiveCell.Offset(4), "SUTP03A_MDC_3", ""
输出:

A612002_MDC_308->A612002:True
B612002_MDC_308->:True
SUTP038_MDC_3->SUTP038:True
KUTP038_MDC_3->:True
SUTP03A_MDC_3->:True

我插入了负前瞻子规则
(?![^{5}[A-Z]{/code>,以拒绝
SUTP03A\u MDC\u 3
。但请注意:拒绝规则正好适用于第7个字符。现在
v_re.IgnoreCase
设置为
True
,但如果只允许大写字符,则将其设置为
False
。另请参见MSDN上的。

将Microsoft VBScript正则表达式5.5添加到项目参考中。使用以下代码测试与Xtractor的匹配和提取:

Public Function Xtractor(ByVal p_val As String) As String
  Xtractor = ""
  Dim ary As String, v_re As New VBScript_RegExp_55.RegExp, Matches
  v_re.Pattern = "^([SAC][^_]{1,6})_?"
  Set Matches = v_re.Execute(p_val)
  If Matches.Count > 0 Then Xtractor = Matches(0).SubMatches(0) Else Xtractor = ""
End Function
Sub test_Xtractor(p_cur As Range, p_val As String, p_expected As String)
  Dim v_cur As Range, v_res As Range
  p_cur.Value = p_val
  Set v_cur = p_cur.Offset(columnOffset:=1)
  v_cur.FormulaR1C1 = "='" & ThisWorkbook.Name & "'!Xtractor(RC[-1])"
  Set v_res = v_cur.Offset(columnOffset:=1)
  v_res.FormulaR1C1 = "=RC[-1]=""" & p_expected & """"
  Debug.Print p_val; "->"; v_cur.Value; ":"; v_res.Value
End Sub
Sub test()
  test_Xtractor ActiveCell, "A612002_MDC_308", "A612002"
  test_Xtractor ActiveCell.Offset(1), "B612002_MDC_308", ""
  test_Xtractor ActiveCell.Offset(2), "SUTP038_MDC_3", "SUTP038"
  test_Xtractor ActiveCell.Offset(3), "KUTP038_MDC_3", ""
End Sub
选择用于编写测试夹具的工作簿和单元格,然后从VBA编辑器中运行
test

立即窗口中的输出(Ctrl+G):

UPD

如果第7个字符是一个返回空白的字母,是否可以将此代码重新编码

将行替换为分配给
v\u re
,方法如下:

v_re.Pattern = "^([SAC](?![^_]{5}[A-Z]_?)[^_]{1,6})_?"
v_re.IgnoreCase = True
并添加到
测试
套件:

test_Xtractor ActiveCell.Offset(4), "SUTP03A_MDC_3", ""
输出:

A612002_MDC_308->A612002:True
B612002_MDC_308->:True
SUTP038_MDC_3->SUTP038:True
KUTP038_MDC_3->:True
SUTP03A_MDC_3->:True
我插入了负前瞻子规则
(?![^{5}[A-Z]{/code>,以拒绝
SUTP03A\u MDC\u 3
。但请注意:拒绝规则正好适用于第7个字符。现在
v_re.IgnoreCase
设置为
True
,但如果只允许大写字符,则将其设置为
False
。另请参见MSDN上的内容。

试试这个

ary = Split(Replace(r.Text, "_", " "))

两种变体的结果相同

试验

更新

你知道如果第七个字符返回一封信,我怎么能把结果留空吗

试验

试试这个

ary = Split(Replace(r.Text, "_", " "))

两种变体的结果相同

试验

更新

你知道如果第七个字符返回一封信,我怎么能把结果留空吗

试验



A612002\u MDC\u 308
这里有两个下划线。你打算提取哪一个?我想提取A612002@SeanBailey你可以看到我的答案。
a6112002\u MDC\u 308
这里有两个下划线。你打算提取哪一个?我想提取A612002@SeanBailey你可以看到我的答案。
a6112002\u MDC\u 308
这里有两个下划线。你打算提取哪一个?我想提取A612002@SeanBailey你得到
a6112002
:-)看看我的答案。我试图格式化你的代码,有人说它不起作用。试着格式化它。@bonCodigo我修正了一些错误。但是VBA样式的自动格式化仍然不能像其他文章那样工作。我不知道为什么。嗨,Aleksey,这似乎工作得很好,并且克服了我在“x”上遇到的问题,不可能编辑此代码,所以如果第7个字符是一个返回空白的字母?@SeanBailey是的,有可能。我试图格式化您的代码,但有人认为它不工作。试着格式化它。@bonCodigo我修正了一些错误。但是VBA样式的自动格式化仍然不能像其他文章那样工作。我不知道为什么。嗨,Aleksey,这似乎工作得很好,并且克服了我在“x”上遇到的问题,不可能编辑此代码,所以如果第7个字符是一个返回空白的字母?@SeanBailey是的,有可能。我试图格式化您的代码,但有人认为它不工作。试着格式化它。@bonCodigo我修正了一些错误。但是VBA样式的自动格式化仍然不能像其他文章那样工作。我不知道为什么。嗨,Aleksey,这似乎工作得非常好,并且克服了我在“x”上遇到的问题,是否可以编辑此代码,因此如果第7个字符是一个返回空白的字母?@SeanBailey是的,是可能的。谢谢,这工作得非常好,你知道如果第7个字符返回一个字母,我如何将结果留空吗?非常感谢你的帮助@SeanBailey我觉得上面的代码是你的。我不知道你上面的代码是上一篇文章中的Vasily写的。我明白了,这就是为什么你很难适应不同的解决方案的原因。这个方法似乎工作得很好!谢谢你的帮助!:)谢谢这真的很好,你知道如果第七个字符返回一封信,我怎么能把结果留空吗?非常感谢你的帮助@SeanBailey我觉得上面的代码是你的。我不知道你上面的代码是上一篇文章中的Vasily写的。我明白了,这就是为什么你很难适应不同的解决方案的原因。这个方法似乎工作得很好!谢谢你的帮助!:)谢谢这真的很好,你知道如果第七次