Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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 Replace函数限制返回的字符_Regex_Excel_Vba - Fatal编程技术网

Regex Replace函数限制返回的字符

Regex Replace函数限制返回的字符,regex,excel,vba,Regex,Excel,Vba,假设此示例单元格数据值超过1600个字符。我的目标是将值7作为受影响/影响的测试用例的值 “6.#受影响/影响的测试用例:77。其他注释:如果适用,请附上屏幕截图说明:” 伪代码: 使用此正则表达式模式删除字符串中数字+点格式的文本(在本例中为6.和7.)“\d[.]” 使用此正则表达式模式查找并提取字符串后面的文本+数字text+“*?\d+” 使用此正则表达式模式从提取的文本中提取数字“\d+” 其他信息: 我需要创建一个函数,让用户在“Find_text”参数中提供自定义文本。自定义文本也

假设此示例单元格数据值超过1600个字符。我的目标是将值7作为受影响/影响的测试用例的值

“6.#受影响/影响的测试用例:77。其他注释:如果适用,请附上屏幕截图说明:”

伪代码:

  • 使用此正则表达式模式删除字符串中数字+点格式的文本(在本例中为6.和7.)“\d[.]”
  • 使用此正则表达式模式查找并提取字符串后面的文本+数字text+“*?\d+”
  • 使用此正则表达式模式从提取的文本中提取数字“\d+”
  • 其他信息:

    我需要创建一个函数,让用户在“Find_text”参数中提供自定义文本。自定义文本也可以是逗号分隔的。这样他们就可以重用函数从特定单元格或文本中提取值。见下面的例子

    “1.测试用例编号:30 2.缺陷编号:5 3.测试用例编号:1001”

    • 如果find_text=“测试用例数:”则输出为30
    • 如果find_text=“缺陷数量:”则输出为5
    • 如果find_text=“测试用例编号:”则输出为1001
    以下是源代码:

    如果删除步骤1,实际输出为77

    • 步骤2的值将为“受影响:77”
    • 步骤3的值将为“77”
    如果我包括步骤1,实际输出是N/A,应该是7

    • 步骤1的值将限制为前255个字符
    • 步骤2的值将为N/A
    • 步骤3的值将为N/A
    源代码:

    Private Function RegExExtract(ByVal Str As String, ByVal Pattern As String, Optional DefaultValue As String, Optional IgnoreCase As Boolean)
    Dim RegEx
    Set RegEx = New RegExp
    RegEx.Pattern = Pattern
    RegEx.Global = True
    RegEx.MultiLine = True
    RegEx.IgnoreCase = IgnoreCase
    If RegEx.Test(Str) Then
        Set Matches = RegEx.Execute(Str)
        RegExExtract = Matches(0).Value
    Else
        RegExExtract = DefaultValue
    End If 
    End Function
    
    Private Function RegExReplace(ByVal Str As String, ByVal Pattern As String, ByVal ReplaceBy As String, Optional DefaultValue As String, Optional IgnoreCase As Boolean)
    Dim RegEx
    Set RegEx = New RegExp
    RegEx.Pattern = Pattern
    RegEx.Global = True
    RegEx.MultiLine = True
    RegEx.IgnoreCase = IgnoreCase
    If RegEx.Test(Str) Then
        RegExReplace = RegEx.Replace(Str, ReplaceBy)
    Else
        RegExReplace = Str
    End If
    End Function
    
    Function RegexExtractNumberAfterString(Source As Range, Find_Text As String, Optional DefaultValue As String, Optional IgnoreCase As Boolean)
    Dim a, b, c, pattern1, pattern2, pattern3
    '   Replace number+dot format e.g 1. 2.
    pattern3 = "\d[.]"
    c = RegExReplace(Source.Value, pattern3, "", DefaultValue, IgnoreCase)
    '   Loop until text is found and extract that text
    Dim arrFindText() As String
    arrFindText() = Split(Find_Text, ",")
    Dim text As Variant
    For Each text In arrFindText
        pattern1 = text + ".*?\d+"
        a = RegExExtract(c, pattern1, DefaultValue, IgnoreCase)
        If Not (a = DefaultValue Or a = "") Then Exit For
    Next text
    '   Extract number from the text
    pattern2 = "\d+"
    b = RegExExtract(a, pattern2, DefaultValue, IgnoreCase)
    RegexExtractNumberAfterString = b
    End Function
    
    Sub RegEx()
     MsgBox (RegexExtractNumberAfterString(Excel.activeCell, "impacted:,test cases:", "N/A", True))
    End Sub
    

    当我将参数替换为ByRef而不是ByVal时,它得到了解决

    旧代码: 私有函数RegExReplace(ByValStr作为字符串,ByVal模式作为字符串,ByValReplaceBy作为字符串,可选DefaultValue作为字符串,可选IgnoreCase作为布尔值)

    新代码:
    私有函数RegExReplace(Str为String,ByVal模式为String,ReplaceBy为String,可选DefaultValue为String,可选IgnoreCase为Boolean)

    当我将参数替换为ByRef而不是ByVal时,它得到了解析

    旧代码: 私有函数RegExReplace(ByValStr作为字符串,ByVal模式作为字符串,ByValReplaceBy作为字符串,可选DefaultValue作为字符串,可选IgnoreCase作为布尔值)

    新代码:
    私有函数RegExReplace(Str作为字符串,ByVal模式作为字符串,ReplaceBy作为字符串,可选DefaultValue作为字符串,可选IgnoreCase作为布尔值)

    请不要发布代码图像。张贴代码本身。图像使得其他人很难尝试代码。谁想键入它?也许只有一个
    regex.Execute
    就可以使用
    (\d+)…*?(\d+)(?=\d\。$)
    ?看见然后只需检查每个文件中的
    Find_Text
    match@JohnColeman谢谢您的建议。@GSerg这就是为什么我需要从伪代码执行步骤1。@WiktorStribiżew我提供了其他信息。请在我检查您提供的正则表达式时进行检查。谢谢。请不要发布代码的图片。张贴代码本身。图像使得其他人很难尝试代码。谁想键入它?也许只有一个
    regex.Execute
    就可以使用
    (\d+)…*?(\d+)(?=\d\。$)
    ?看见然后只需检查每个文件中的
    Find_Text
    match@JohnColeman谢谢您的建议。@GSerg这就是为什么我需要从伪代码执行步骤1。@WiktorStribiżew我提供了其他信息。请在我检查您提供的正则表达式时进行检查。非常感谢。