Regex Replace函数限制返回的字符
假设此示例单元格数据值超过1600个字符。我的目标是将值7作为受影响/影响的测试用例的值 “6.#受影响/影响的测试用例:77。其他注释:如果适用,请附上屏幕截图说明:” 伪代码:Regex Replace函数限制返回的字符,regex,excel,vba,Regex,Excel,Vba,假设此示例单元格数据值超过1600个字符。我的目标是将值7作为受影响/影响的测试用例的值 “6.#受影响/影响的测试用例:77。其他注释:如果适用,请附上屏幕截图说明:” 伪代码: 使用此正则表达式模式删除字符串中数字+点格式的文本(在本例中为6.和7.)“\d[.]” 使用此正则表达式模式查找并提取字符串后面的文本+数字text+“*?\d+” 使用此正则表达式模式从提取的文本中提取数字“\d+” 其他信息: 我需要创建一个函数,让用户在“Find_text”参数中提供自定义文本。自定义文本也
- 如果find_text=“测试用例数:”则输出为30
- 如果find_text=“缺陷数量:”则输出为5
- 如果find_text=“测试用例编号:”则输出为1001
- 步骤2的值将为“受影响:77”
- 步骤3的值将为“77”
- 步骤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我提供了其他信息。请在我检查您提供的正则表达式时进行检查。非常感谢。