Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
使用RegExp在单个正斜杠上拆分字符串_Regex_Vba_Excel - Fatal编程技术网

使用RegExp在单个正斜杠上拆分字符串

使用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)

编辑:哇,谢谢你这么多建议,但我想有一个专门用于未来更复杂用途的regexp解决方案

我需要在VBA Excel中拆分文本字符串的支持。我环顾四周,但解决方案要么适用于其他语言,要么我无法使其在VBA中工作

我只想用单斜杠拆分单词:

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