替换为Excel中的常规表达式
我在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中执行此操作?非
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"