使用RegExp在单个正斜杠上拆分字符串
编辑:哇,谢谢你这么多建议,但我想有一个专门用于未来更复杂用途的regexp解决方案 我需要在VBA Excel中拆分文本字符串的支持。我环顾四周,但解决方案要么适用于其他语言,要么我无法使其在VBA中工作 我只想用单斜杠拆分单词:使用RegExp在单个正斜杠上拆分字符串,regex,vba,excel,Regex,Vba,Excel,编辑:哇,谢谢你这么多建议,但我想有一个专门用于未来更复杂用途的regexp解决方案 我需要在VBA Excel中拆分文本字符串的支持。我环顾四周,但解决方案要么适用于其他语言,要么我无法使其在VBA中工作 我只想用单斜杠拆分单词: text1/text2- split text1//text2- no split text1/text2//text3 - split after text1 我尝试使用regexp.split函数,但认为它在VBA中不起作用。说到模式,我的想法如下: (?i)
text1/text2- split
text1//text2- no split
text1/text2//text3 - split after text1
我尝试使用regexp.split函数,但认为它在VBA中不起作用。说到模式,我的想法如下:
(?i)(?:(?<!\/)\/(?!\/))
(?i)(?:(?)?
但在我的宏中执行搜索时也会出错,因为它在以下站点上运行:转到“数据”选项卡,然后选择“文本到列”选项。稍后,选择“分隔”选项,然后选择“其他”并放置任何您想要的分隔符。文本到列将起作用。如果要保留原始值,另一个选项是使用公式:
在B1中
在C1中
或
您可以使用RegExp匹配方法而不是拆分方法。您需要匹配除/
或双/
以外的任何字符以获取所需的值
以下是正则表达式的“包装”(即带有替换)版本:
(?:[^/]|//)+
这是一个
下面是一个更有效但可读性较差的方法:
[^/]+(?://[^/]*)*
看
下面是一个工作的VBA代码:
Sub GetMatches(ByRef str As String, ByRef coll As collection)
Dim rExp As Object, rMatch As Object
Set rExp = CreateObject("vbscript.regexp")
With rExp
.Global = True
.pattern = "(?:[^/]|//)+"
End With
Set rMatch = rExp.Execute(str)
If rMatch.Count > 0 Then
For Each r_item In rMatch
coll.Add r_item.Value
Debug.Print r_item.Value
Next r_item
End If
Debug.Print ""
End Sub
按如下方式调用sub:
Dim matches As New collection
Set matches = New collection
GetMatches str:="text1/text2", coll:=matches
以下是上述3个字符串的结果:
1. text1/text2
text1
text2
2. text1/text2//text3
text1
text2//text3
3. text1//text2
text1//text2
我认为您必须进行匹配而不是拆分。如何使文本到列功能只在单斜杠(/
)上拆分,而不是在双斜杠(/
)上拆分?=右(A1,LEN(A1)-查找(“~”,替换(A1),“\”,“~”,LEN(A1)-LEN(替换(A1),“,”))=iferror(右(H15,LEN)(H15)-搜索(“,”,替换(H15),“,”,“;”,LEN(H15)-LEN)(替换为(H15,“/”,“;”)),“-”)谢谢你的建议,但我想知道是否有可用的正则表达式解决方案。我将来可能需要更多的动态拆分,替换函数不会直接将其删除。哇,这太棒了,通过测试运行,它看起来正是我所需要的。这已经困扰了我半天。匹配对我来说是一个新概念,所以我需要对f进行反向工程完全理解它。非常感谢!这将是非常有用的学习经验。如果您在为包含lookbehind的VBA调整oother regexp时遇到其他问题,请查找“lookbehind解决方案”。请注意,您几乎总是需要将部分模式转换为代码。请使用符合JavaScript的在线正则表达式测试程序。至于拆分,在大多数情况下,它可以替换为匹配,并且通常可读性更高。一个简单的问题。我现在记得我以前使用过类似的方法迭代匹配,但我得到了匹配而不是它们之间的值。例如:对于intIndex=1到objMatch.Count(我只返回了斜杠),在您的示例中它如何返回文本?它必须“For Each”吗语句?您得到斜杠是因为objMatch
包含匹配项。这就是正则表达式的作用:匹配特定的文本模式。拆分时,您仍然匹配一些(序列)作为给定输入的分隔符。<<代码> >每个只帮助重复匹配或子匹配,但不需要它们,因为在我建议的模式中没有捕获组。我希望你不介意问,但是如果我想使用相同的逻辑,也可以考虑单词“和”。在逻辑中?所以它会用正斜杠和/或“and”这个词分开。我想用否定的前瞻,但似乎无法使它工作(?!\sand)[^\/]+(?:\/\/[^\/]*)*
[^/]+(?://[^/]*)*
Sub GetMatches(ByRef str As String, ByRef coll As collection)
Dim rExp As Object, rMatch As Object
Set rExp = CreateObject("vbscript.regexp")
With rExp
.Global = True
.pattern = "(?:[^/]|//)+"
End With
Set rMatch = rExp.Execute(str)
If rMatch.Count > 0 Then
For Each r_item In rMatch
coll.Add r_item.Value
Debug.Print r_item.Value
Next r_item
End If
Debug.Print ""
End Sub
Dim matches As New collection
Set matches = New collection
GetMatches str:="text1/text2", coll:=matches
1. text1/text2
text1
text2
2. text1/text2//text3
text1
text2//text3
3. text1//text2
text1//text2