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
Regex 替换字符串中的所有字符,除非它们位于双引号内_Regex_Vba_Excel - Fatal编程技术网

Regex 替换字符串中的所有字符,除非它们位于双引号内

Regex 替换字符串中的所有字符,除非它们位于双引号内,regex,vba,excel,Regex,Vba,Excel,遗憾的是,我不熟悉正则表达式,因为我不是程序员,但我想这个问题很容易用正则表达式解决(不过,我肯定会接受其他建议) 我想使用split函数分割一个单元格的值,并将其分散到多个单元格上。分隔符是逗号。但问题是,一些用户在注释中使用逗号,例如,Split函数使用逗号在注释中间拆分字符串 例如,包含以下值的单元格: 0001,“姓名”,“地址”,“喜欢苹果,桔子 还有李子“ 需要分成多个单元格,分别显示0001“姓名”、“地址”和“喜欢苹果、桔子和李子” 我的代码也会分割注释,我希望它用双引号忽略注释

遗憾的是,我不熟悉正则表达式,因为我不是程序员,但我想这个问题很容易用正则表达式解决(不过,我肯定会接受其他建议)

我想使用split函数分割一个单元格的值,并将其分散到多个单元格上。分隔符是逗号。但问题是,一些用户在注释中使用逗号,例如,Split函数使用逗号在注释中间拆分字符串

例如,包含以下值的单元格:

0001,“姓名”,“地址”,“喜欢苹果,桔子 还有李子“

需要分成多个单元格,分别显示0001“姓名”、“地址”和“喜欢苹果、桔子和李子”

我的代码也会分割注释,我希望它用双引号忽略注释或其他所有内容。以下是一个示例:

Sub SplittingStrings()
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim strInput As String
    Dim counter As Integer
    Dim cell As Variant
    Dim splitCount As Integer
    Dim splitString() As String
    Dim category As Variant

    Set wb = ActiveWorkbook
    Set ws = wb.ActiveSheet

    counter = 1

    For Each cell In Range("A1", "A2000")

        If cell.Value <> "" Then
            strInput = cell.Value
            splitCount = 2
            splitString = Split(strInput, ",")

            For Each category In splitString
                Cells(counter, splitCount).Value = category
                splitCount = splitCount + 1
            Next category
        End If

        counter = counter + 1

    Next cell


End Sub
子拆分字符串()
将wb设置为工作簿
将ws设置为工作表
像弦一样的模糊的条纹
作为整数的Dim计数器
变暗细胞
Dim splitCount为整数
Dim splitString()作为字符串
作为变体的Dim类别
设置wb=ActiveWorkbook
设置ws=wb.ActiveSheet
计数器=1
对于范围内的每个单元格(“A1”、“A2000”)
如果单元格的.Value为“”,则
strInput=cell.Value
拆分计数=2
splitString=Split(strInput,“,”)
对于splitString中的每个类别
单元格(计数器、拆分计数)。值=类别
splitCount=splitCount+1
下一类
如果结束
计数器=计数器+1
下一个细胞
端接头

如何将带有双引号的内容排除在拆分函数的考虑范围之外?

请尝试一下,看看是否获得了所需的输出

如果需要,调整变量

Sub SplittingStringsUsingRegEx()
Dim lr As Long, c As Long
Dim Rng As Range, cell As Range
Dim RE, Match, Matches

Application.ScreenUpdating = False
lr = Cells(Rows.Count, 1).End(xlUp).Row
Set Rng = Range("A1:A" & lr)

Set RE = CreateObject("VBScript.RegExp")
With RE
    .Global = True
    .Pattern = "\d+|"".+?"""
End With

c = 2

For Each cell In Rng
    If RE.test(cell.Value) Then
        Set Matches = RE.Execute(cell.Value)
        For Each Match In Matches
            Cells(cell.Row, c) = Replace(Match, """", "")
            c = c + 1
        Next Match
    End If
    c = 2
Next cell

Application.ScreenUpdating = True

End Sub
没有正则表达式:

我们需要“保护”用双引号封装的逗号:

Sub ProtectStuff()
    Dim i As Long, N As Long, v As String, v2 As String
    Dim ProtectMode As Boolean, DQ As String, rep As String
    Dim CH As String, arr

    DQ = """"
    rep = Chr(1)
    N = Cells(Rows.Count, "A").End(xlUp).Row

    For i = 1 To N
        v = Cells(i, "A").Value
        If v <> "" Then
            ProtectMode = False
            v2 = ""
            For j = 1 To Len(v)
                CH = Mid(v, j, 1)
                If CH = DQ Then ProtectMode = Not ProtectMode
                If CH = "," And ProtectMode Then CH = rep
                v2 = v2 & CH
            Next j
        End If

        arr = Split(v2, ",")
        j = 2
        For Each a In arr
            Cells(i, j) = Replace(a, rep, ",")
            j = j + 1
        Next a
    Next i
End Sub
Sub-ProtectStuff()
尺寸i为长,N为长,v为字符串,v2为字符串
Dim ProtectMode为布尔值,DQ为字符串,rep为字符串
调暗的琴弦,arr
DQ=“”“
rep=Chr(1)
N=单元格(Rows.Count,“A”)。结束(xlUp)。行
对于i=1到N
v=单元格(i,“A”)。数值
如果v“那么
ProtectMode=False
v2=“”
对于j=1到Len(v)
CH=中间(v,j,1)
如果CH=DQ,则ProtectMode=Not ProtectMode
如果CH=“,”和ProtectMode,则CH=rep
v2=v2&CH
下一个j
如果结束
arr=拆分(v2,“,”)
j=2
对于arr中的每个a
单元格(i,j)=替换(a,rep,“,”)
j=j+1
下一个
接下来我
端接头

文本到列将执行您想要的操作,与拆分功能不同。

您可以使用内置的Excel“文本到列”,这将正确拆分它。不需要VBA。@braX-如果我理解OP,我可能不理解,他们不希望它在引号内用逗号分隔,所以“喜欢苹果、桔子和李子”应该被忽略。@SJR-这是绝对正确的,抱歉,不清楚。@SJR文本到列处理该问题-默认情况下,它假定引号是文本限定符,并且不会在引号内用逗号分隔。@Rory-曙光初现,谢谢。在一次测试之后,第一条注释解决了这个问题(我把它全部收回@braX),所以它似乎是有效的,然而,一个
被删除了才能工作,所以在Excel中,它必须加倍
才能识别
”?这是正确的。要输入双引号,您需要将双引号加倍。:)