求VBA中一简单正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求VBA中一简单正则表达式相关的知识,希望对你有一定的参考价值。
求匹配中间字符串的正则表达式!
如:abcdef (字符串很复杂,这只是简化举例)
如何利用两边ab,ef;得到中间一段cd
().*(?=ef)
前面小括内该如何写法???或是有其它写法???
'利用正则式提取字符串中的特定字符自定义函数
'要引用microsoft vbscript regular expressions 5.5
Function RegExpTest(patrn, strng)
Dim RegEx, Match, Matches ' 建立变量。
Set RegEx = New RegExp ' 建立正则表达式。
With RegEx
.Pattern = patrn ' 设置模式。
.IgnoreCase = True ' 设置是否区分字符大小写。
.Global = False ' 设置全局可用性。
Set Matches = .Execute(strng) ' 执行搜索。
End With
For Each Match In Matches ' 遍历匹配集合。
'RetStr = RetStr & "Match found at position "
'RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
'RetStr = RetStr & Match.Value & "'." & vbCrLf
retstr = Match.Value
Next
RegExpTest = retstr
End Function
Sub TEST()
MsgBox (RegExpTest("(?<=ab).+(?=ef)", "abcdef")) 'EXCEL中出错
End Sub
即可
用+替代掉*就去除了abef这样连用而中间没内容的部分
我找到原因了,查MSDN发现VBScript的正则太简单了,不支持标准正则的位置锚定的(?<)和(?=)
因此改成
ab.+ef
这样会返回abcdef,好在ab和ef都是确定的,从结果中去掉就可以了,可以用replace,也可以直接用instr之类的函数。 参考技术B VB 不支持后瞻,所以只能用分组实现.直接分组替换
Dim ResultString As String
Dim myRegExp As RegExp
Set myRegExp = New RegExp
myRegExp.Global = True
myRegExp.Pattern = "(?:ab)(.+)(?:(?:ef))"
ResultString = myRegExp.Replace(SubjectString, "$1")本回答被提问者采纳
无法在 vba IE 中应用正则表达式
【中文标题】无法在 vba IE 中应用正则表达式【英文标题】:Unable to apply regex within vba IE 【发布时间】:2018-12-20 12:42:08 【问题描述】:我编写了一个脚本,使用 vba 结合 IE 来解析应用 regex 的网页中的联系信息。我搜索了很多,但找不到任何可以满足我要求的示例。 pattern
可能不适合找到 phone
号码,但这里主要关注的是如何在 vba IE 中使用 pattern
。
再一次:我的意图是在 vba IE 中应用 regex
从该网页解析电话号码 661-421-5861
。
这是我迄今为止尝试过的:
Sub FetchItems()
Const URL$ = "https://www.nafe.com/bakersfield-nafe-network"
Dim IE As New InternetExplorer, HTML As HTMLDocument
Dim rxp As New RegExp, email As Object, Row&
With IE
.Visible = True
.navigate URL
While .Busy = True Or .readyState < 4: DoEvents: Wend
Set HTML = .document
End With
With rxp
.Pattern = "(?<=Phone:)\s*?.*?([^\s]+)"
Set email = .Execute(HTML.body.innerText) 'I'm getting here an error
If email.Count > 0 Then
Row = Row + 1: Cells(Row, 1) = email.Item(0)
End If
End With
IE.Quit
End Sub
当我执行上述脚本时,我遇到了一个错误对象“IRegExp2”的方法“执行”失败,当它遇到包含Set email = .Execute(HTML.body.innerText)
的行时。怎样才能成功?
【问题讨论】:
稍后,您还会收到与您的正则表达式相关的错误,因为 VBA 正则表达式不支持后视。此外,该页面似乎不包含Contact:
字符串。也许你应该先登录。
很高兴收到您的来信@Wiktor Stribiżew。这对我来说也是一个新信息。模式可能不准确。但是,我只想知道如何在 vba IE 中应用它。
好的,我已经修复了在模式中错误使用 Contact:
的问题。
【参考方案1】:
请注意,VBA 正则表达式不支持lookbehinds。在这里,您可能想要捕获Phone:
之后的任何数字和任意数量的数字和连字符。
您需要将模式重新定义为
rxp.Pattern = "Phone:\s*(\d[-\d]+)"
然后,您需要获取第一场比赛并访问其.SubMatches(0)
:
Set email = .Execute(HTML.body.innerText)
If email.Count > 0 Then
Cells(Row+1, 1) = email.Item(0).SubMatches(0)
End If
请参阅regex in action。 sting 中绿色突出显示的部分是 .SubMatches(0)
所持有的。
模式详情
Phone:
- 文字子字符串
\s*
- 0+ 个空格
(\d[-\d]+)
- 捕获组 1:一个数字,后跟 1+(由于 +
,您可以替换为 *
以匹配零个或多个)数字或/和连字符。
【讨论】:
你让我很开心@Wiktor Stribiżew。非常感谢。 对此[-\d]+
部分@Wiktor Stribiżew 有一个小问题。让我困惑的是followed with 1+ digits or/and hyphens
。由于我是初学者,到目前为止我知道[-\d]+
意味着followed with 1+ digits or hyphens
。请注意or
。那么为什么它也是and
呢?评论中的单线澄清就足够了。提前感谢您查看它。
@Topto positive 字符类的元素是 ORed。 [\d-]+
matches 1 个或多个数字或连字符字符,匹配 -------------
、-2-3-5-6-87-9
或 1223445678988
。 negative 字符类的元素是 AND,[^\d-]+
匹配 1 个或多个不是数字 AND 不是连字符的字符。
没有更清楚的了。一个人解决问题真的很困难。非常感谢。【参考方案2】:
这是使用 xmlhttp 对象的一种更快捷的方法
Sub FetchItems()
Dim URL As String, strBody As String
Dim intS As Long, intE As Long
URL = "https://www.nafe.com/bakersfield-nafe-network"
Dim xml As Object
Set xml = CreateObject("MSXML2.XMLHTTP")
xml.Open "GET", URL, False
xml.send
Dim html As Object
Set html = CreateObject("htmlfile")
html.body.innerHTML = xml.responseText
strBody = html.body.innerHTML
intS = InStr(1, strBody, "Phone:", vbTextCompare) + Len("Phone:")
intE = InStr(intS, strBody, "<", vbTextCompare)
MsgBox Mid(strBody, intS, intE - intS)
End Sub
【讨论】:
感谢@Santosh,您的回答。这更快,但这不是我寻求解决方案的目的。提供加一。 @Topto 我知道,但肯定会对其他读者有用:-)以上是关于求VBA中一简单正则表达式的主要内容,如果未能解决你的问题,请参考以下文章