如何在另一个字符串中查找可变长度的字符串
How to find a string of characters, of a variable length within another string
我正在尝试编写一些正则表达式,从一个字符串中提取 2 - 3 个 alpha 章程。
这是字符串“01EY003 - P3 MOTOR STOP”的示例。 "E" & "Y" 是我从这个特定字符串中需要的。字符前面总是有 2 个数字字符。在 "Y" 所在的位置,最多可以包含 3 个字符。所需的字符也可以位于字符串中的任何位置。所以字符串可能类似于 "P3 MOTOR STOP, 01EYAQ003"。
这是一些样本数据。左边是源字符串的一些例子,右边是我要提取的内容。
“01FT108 - TMPRD 油流量 E944A”- FT
“01FIT110 - 从 E101 刷新 SHELL”- FIT
“01FC111 - 切刀 FR P21/22 流量”- FC
“01FC112 - P6A E946 HEADER 流量” - FC
“01FT113 - TMPRD 油流量 E946A”- FT
“5 TAR LINE FLOW- 01FT005”-金融时报
感谢任何帮助。我一直在搜索论坛试图学习正则表达式,因为我从来没有用过它,所以我很不擅长它。
我将这个正则表达式嵌入到 vb 脚本中。所以我尝试使用一些简单的正则表达式“[a-zA-Z]”。然后使用代码进行计算,因为我对 reg ex 很不满意。
这是我将要使用正则表达式的地方。我很擅长 vb 脚本,这只是一个小测试。
Sub Test_Execute(Batch)
Dim objRE, objMatch, i
Stop
Set objRE = New RegExp
objRE.Pattern = "[a-zA-Z]"
objRE.Global = True
objRE.IgnoreCase = True
Set objMatch = objRE.Execute(Document.DwgTitleLine2)
For i = 0 To 5
If objRE.Test(objMatch(i).value)Then
WinMsgBox "First Char True"
Else
WinMsgBox "First Char False"
End If
Next
End Sub
当我用我的简单正则表达式使用这段代码时。每个循环都只带回字母字符。甚至 "P3 MOTOR STOP" 中的所有内容,我都不关心。显然是因为我在正则表达式中几乎没有规则。
您可以使用
(?:^|\s)\d{2}([a-zA-Z]+)
它匹配:
(?:^|\s)
- 字符串或空格的开头
\d{2}
- 两位数
([a-zA-Z]+)
- 第 1 组 (match.Submatches(0)
):1+ 个 ASCII 字母。
VBA:
Set objMatch = objRE.Execute(Document.DwgTitleLine2)
For Each m In objMatch
Debug.Print m.Submatches(0)
Next
我正在尝试编写一些正则表达式,从一个字符串中提取 2 - 3 个 alpha 章程。 这是字符串“01EY003 - P3 MOTOR STOP”的示例。 "E" & "Y" 是我从这个特定字符串中需要的。字符前面总是有 2 个数字字符。在 "Y" 所在的位置,最多可以包含 3 个字符。所需的字符也可以位于字符串中的任何位置。所以字符串可能类似于 "P3 MOTOR STOP, 01EYAQ003"。
这是一些样本数据。左边是源字符串的一些例子,右边是我要提取的内容。
“01FT108 - TMPRD 油流量 E944A”- FT
“01FIT110 - 从 E101 刷新 SHELL”- FIT
“01FC111 - 切刀 FR P21/22 流量”- FC
“01FC112 - P6A E946 HEADER 流量” - FC
“01FT113 - TMPRD 油流量 E946A”- FT
“5 TAR LINE FLOW- 01FT005”-金融时报
感谢任何帮助。我一直在搜索论坛试图学习正则表达式,因为我从来没有用过它,所以我很不擅长它。
我将这个正则表达式嵌入到 vb 脚本中。所以我尝试使用一些简单的正则表达式“[a-zA-Z]”。然后使用代码进行计算,因为我对 reg ex 很不满意。
这是我将要使用正则表达式的地方。我很擅长 vb 脚本,这只是一个小测试。
Sub Test_Execute(Batch)
Dim objRE, objMatch, i
Stop
Set objRE = New RegExp
objRE.Pattern = "[a-zA-Z]"
objRE.Global = True
objRE.IgnoreCase = True
Set objMatch = objRE.Execute(Document.DwgTitleLine2)
For i = 0 To 5
If objRE.Test(objMatch(i).value)Then
WinMsgBox "First Char True"
Else
WinMsgBox "First Char False"
End If
Next
End Sub
当我用我的简单正则表达式使用这段代码时。每个循环都只带回字母字符。甚至 "P3 MOTOR STOP" 中的所有内容,我都不关心。显然是因为我在正则表达式中几乎没有规则。
您可以使用
(?:^|\s)\d{2}([a-zA-Z]+)
它匹配:
(?:^|\s)
- 字符串或空格的开头\d{2}
- 两位数([a-zA-Z]+)
- 第 1 组 (match.Submatches(0)
):1+ 个 ASCII 字母。
VBA:
Set objMatch = objRE.Execute(Document.DwgTitleLine2)
For Each m In objMatch
Debug.Print m.Submatches(0)
Next