替换为Excel中的常规表达式

替换为Excel中的常规表达式,excel,excel-formula,powerquery,regexp-replace,Excel,Excel Formula,Powerquery,Regexp Replace,我在Excel中有如下列表: 1 / 6 / 45 123 1546 123 456 1247 /% 456 / 我想创建一个新列,用字符替换所有连续非数字序列。在Google工作表中,使用=REGEXREPLACE(A1&“/”、“\D+”、“,”)很容易,结果是: 1,6,45, 123, 1546, 123,456 1247,456, 在这个公式中,A1&“/”是需要的,以便REGEXREPLACE能够处理数字。没什么大不了的,只是在结尾加一个逗号 如何在Excel中执行此操作?非

我在Excel中有如下列表:

1 / 6 / 45
123
1546
123 456 
1247 /% 456 /
我想创建一个新列,用字符替换所有连续非数字序列。在Google工作表中,使用
=REGEXREPLACE(A1&“/”、“\D+”、“,”)
很容易,结果是:

1,6,45,
123,
1546,
123,456 
1247,456,
在这个公式中,
A1&“/”
是需要的,以便
REGEXREPLACE
能够处理数字。没什么大不了的,只是在结尾加一个逗号

如何在Excel中执行此操作?非常鼓励使用纯powerquery(不是R,不是Python,只是M)VBA和其他可单击的Excel功能是不可接受的(如查找和替换)

如果您有Excel 365:

B1
中:

=LET(X,MID(A1,SEQUENCE(LEN(A1)),1),SUBSTITUTE(TRIM(CONCAT(IF(ISNUMBER(--X),X," ")))," ",","))
或者,如果数字条纹始终由至少一个空格分隔:

=TEXTJOIN(",",,FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[.*0=0]"))
=TEXTJOIN(“,”,FILTERXML(“&SUBSTITUTE(A1,”,“”)和“//s[*0=0]”)

如果您有权访问它,另一个选项是
LAMBDA()
。创建一个函数来替换所有类型的字符,类似于。如果没有
LAMBDA()
TEXTJOIN()
我想你最好的办法是开始嵌套
SUBSTITUTE()
函数。

如果你有
TEXTJOIN
函数,这是另一个变体


=SUBSTITUTE(TRIM(TEXTJOIN(“),TRUE,IFERROR(MID(A2,ROW($A$1:INDEX(A:A,LEN(A2))),1)+0,”),“,”,”
这是一个强大的查询解决方案。 它利用
List.Accumulate
函数来确定是否向字符串中添加数字或逗号:

请注意,代码复制了您显示的结果。如果您希望避免尾随(和/或前导)逗号,则可以轻松修改它

let
    Source = Excel.CurrentWorkbook(){[Name="Table5"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "textToList", each List.Combine({Text.ToList([Column1]),{","}})),
    
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "commaTerminators", each List.Accumulate(
      [textToList],"", (state,current) => 
            if List.Contains({"0".."9"},current)
                then state & current
            else if Text.EndsWith(state,",") 
                then state  
            else state & ",")),
        
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom1",{"textToList"})
in
    #"Removed Columns"

Edit为了消除前导/尾随逗号,我们添加了
Text.Trim
函数,在Power Query中,该函数允许定义从开始/结束修剪的特定文本:

VBA UDF您提到您不想要VBA,但不清楚您是否将其限制为“可点击”。这是一个用户定义的函数,可以直接在工作表上使用。它使用VBA正则表达式引擎,可以轻松提取多个匹配项

您可以在工作表上输入一个公式,例如
=commaSep(cell\u ref)
,以获得与上面第二个PQ示例中所示相同的结果


以及电源查询中的另一个选项

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTQVzADYhNTpVgdINfIGEKbmpjBBIByZgpQjom5gr4qWEBfKTYWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    x1 = Table.AddColumn(#"Changed Type", "x1", each Text.ToList([Column1])),
    x2 = Table.AddColumn(x1, "x2", each List.Transform([x1], each if Text.Contains("0123456789", _) then _ else " "  )),
    x3 = Table.AddColumn(x2, "x3", each Text.Split(Text.Combine([x2])," ")),
    x4 = Table.AddColumn(x3, "x4", each List.Transform([x3], each if Text.Contains("0123456789", try Text.At(_,0) otherwise " ") then _&"," else "" )),
    x5 = Table.AddColumn(x4, "x5", each Text.Combine([x4])),
    #"Removed Columns" = Table.RemoveColumns(x5,{"x1", "x2", "x3", "x4"})
in
    #"Removed Columns"

Option Explicit
Function commaSep(S As String) As String
    Dim RE As Object, MC As Object, M As Object
    Dim sTemp As String
    
Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = "\d+"
    If .test(S) Then
        Set MC = .Execute(S)
        sTemp = ""
        For Each M In MC
            sTemp = sTemp & "," & M
        Next M
        commaSep = Mid(sTemp, 2)
    Else
        commaSep = "no digits"
    End If
End With
let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTQVzADYhNTpVgdINfIGEKbmpjBBIByZgpQjom5gr4qWEBfKTYWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Column1 = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),
    x1 = Table.AddColumn(#"Changed Type", "x1", each Text.ToList([Column1])),
    x2 = Table.AddColumn(x1, "x2", each List.Transform([x1], each if Text.Contains("0123456789", _) then _ else " "  )),
    x3 = Table.AddColumn(x2, "x3", each Text.Split(Text.Combine([x2])," ")),
    x4 = Table.AddColumn(x3, "x4", each List.Transform([x3], each if Text.Contains("0123456789", try Text.At(_,0) otherwise " ") then _&"," else "" )),
    x5 = Table.AddColumn(x4, "x5", each Text.Combine([x4])),
    #"Removed Columns" = Table.RemoveColumns(x5,{"x1", "x2", "x3", "x4"})
in
    #"Removed Columns"