我收到带有以下字段的消息。我想分组并提取用户输入。大多数提交都包含所有字段,而正则表达式效果很好。如果有人删除其他行(假设他们仅需要填写金额1),就会出现问题
Name:
Number:
Amount:
Old Code:
Code 1:
Amount 1:
Code 2:
Amount 2:
Code 3:
Amount 3:
Code 4:
Amount 4:
我正在使用Alteryx解析消息内容,并使用我当前的正则表达式取得了成功,但希望为避免不可避免的用户提交不一致做好准备
Name:(.+)\sNumber:(.+)\sAmount:(.+)\sOld Code:(.+)\sCode 1:(.+)\sAmount 1:(.+)\sCode 2:(.*?)\sAmount 2:(.*?)\sCode 3:(.*?)\sAmount 3:(.*?)\sCode 4:(.*?)\sAmount 4:(.*?[^-]*)
即使删除列出的字段,Alteryx是否有可能从消息中返回解析结果?
答案 0 :(得分:1)
无论如何,您始终可以围绕
进行级联嵌套的可选分组
线只匹配有效点。
这期望表格行是有序的。如果不是,则使用其他类型
regex是必需的-乱序regex(请参阅底部的regex)。
这两个正则表达式均适用于Perl 5.10
(?-ms)Name:(.*)(?:\s+Number:(.*)(?:\s+Amount:(.*)(?:\s+Old[ ]+Code:(.*)(?:\s+Code[ ]+1:(.*)(?:\s+Amount[ ]+1:(.*)(?:\s+Code[ ]+2:(.*)(?:\s+Amount[ ]+2:(.*)(?:\s+Code[ ]+3:(.*)(?:\s+Amount[ ]+3:(.*)(?:\s+Code[ ]+4:(.*)(?:\s+Amount[ ]+4:(.*?[^-]*))?)?)?)?)?)?)?)?)?)?)?
https://regex101.com/r/9oKXEE/1
对于乱序匹配,请使用
(?m-s)\A(?:[\S\s]*?(?:(?(1)(?!))^\h*Name\h*:\h*(.*)|(?(2)(?!))^\h*Number\h*:\h*(.*)|(?(3)(?!))^\h*Amount\h*:\h*(.*)|(?(4)(?!))^\h*Old\h*Code\h*:\h*(.*)|(?(5)(?!))^\h*Code\h*1\h*:\h*(.*)|(?(6)(?!))^\h*Amount\h*1\h*:\h*(.*)|(?(7)(?!))^\h*Code\h*2\h*:\h*(.*)|(?(8)(?!))^\h*Amount\h*2\h*:\h*(.*)|(?(9)(?!))^\h*Code\h*3\h*:\h*(.*)|(?(10)(?!))^\h*Amount\h*3\h*:\h*(.*)|(?(11)(?!))^\h*Code\h*4\h*:\h*(.*)|(?(12)(?!))^\h*Amount\h*4\h*:\h*(.*?))){1,12}
答案 1 :(得分:0)
在这种情况下,您无需立即使用Regex,并且鉴于数据不一致,可能需要一段时间来完善一个regex术语...
您可以这样操作: -首先是RecordID, -然后,您可以使用带有换行符(\ n)的文本2列。将此配置为“拆分为行”。 -然后,您可以使用“文本到列”在除斜符“:”上拆分。
这将处理输入的其他行,等等。在该阶段,您可以弄清楚如何清理结果(过滤器以删除空行,多行以标记记录,交叉表以创建表等)。 )。如果要标记任何未知行,则可以使用带有所需行的文本输入,然后使用“查找/替换”或“联接”来分隔数据。