【问题标题】:Can I make my Alteryx RegEx parse conditional?我可以让我的 Alteryx RegEx 解析有条件吗?
【发布时间】:2019-11-25 12:28:07
【问题描述】:

我收到包含以下字段的消息。我想对用户输入进行分组和提取。大多数提交的内容都包含所有字段,并且正则表达式效果很好。如果有人删除额外的行,假设他们只需要填写到 Amount 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 是否可以从消息中返回解析结果?

Alteryx issue with new cascading regex

【问题讨论】:

  • 这是表格吗?用户在修改“表单”时有多少控制权?
  • 我已经分发了一个用于用户提交的 Outlook 模板,但用户具有修改/删除行的全部功能
  • 好吧,我们可以为这些行做一个 out-of-order 正则表达式并稍微放松一下对行的解析。想试试吗?

标签: regex alteryx


【解决方案1】:

无论如何,您始终可以围绕
进行级联嵌套可选分组 行以匹配在某一点之前有效的内容。
这期望表单行是有序的。如果不是,则另一种类型
需要正则表达式 - 无序正则表达式(见底部正则表达式)。

这两个正则表达式都适用于 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}

https://regex101.com/r/f2rG1v/1

【讨论】:

  • 尝试这个我只得到一个分组结果。解析名称就好了,但将所有其他消息内容保留在组 1 中
  • 应该没问题,看看这些regex101.com/r/9oKXEE/1regex101.com/r/I38jil/1
  • 在 regex101 上的工作就像一个魅力,但 Alteryx 正在捕获第 1 组中的所有内容?如果有帮助,Alteryx 使用 Perl 5 正则表达式语法
  • 我添加了一个新的正则表达式,并且还放置了一些内联标志,以防默认为全点。基本上,我关闭了内联修饰符 (?-s) 中的点匹配换行符,它将在运行时覆盖任何默认标志。
  • 注意 - 如果可以,请使用无序正则表达式。如果捕获组为空,则该行不存在,如果它为空,则该行存在但没有输入。如果组包含字符串,则该行既存在又包含数据。
【解决方案2】:

在这种情况下,您不需要直接使用正则表达式,并且考虑到不一致的数据,可能需要一段时间才能完善一个正则表达式术语...

您可以这样做: - 首先记录ID, - 然后您可以使用带有换行符 (\n) 分隔符的 Text 2 Columns。将此配置为“拆分为行”。 - 然后您可以使用文本到列在分隔符“:”上拆分。

这将处理输入的其他行等。在那个阶段,您可以弄清楚如何清理结果(过滤以删除空行,多行标记记录,交叉表以创建表等... )。如果您想标记任何未知行,您可以使用包含所需行的文本输入,并使用查找/替换或连接来分隔数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 2011-11-14
    • 2020-11-27
    相关资源
    最近更新 更多