【问题标题】:RegEx works everywhere except in Pentaho RegEx Evaluation StepRegEx 在 Pentaho RegEx 评估步骤之外的任何地方都有效
【发布时间】:2019-05-07 14:05:52
【问题描述】:

我有几个正则表达式可以在在线正则表达式网站上使用,但不能在 Pentaho 中使用。你能帮忙吗?

这是字符串:

:6585d0f0ba88767ac3b590f719596d864d73e9c1:

harmonicbalance/src/harmonicbalance/HarmonicBalanceFlowModel.cpp
harmonicbalance/src/harmonicbalance/HbFlutterModel.cpp
:8302994b565553c83a048b8905ae597349d99627:

emp/src/emp/PhasePairSingleParticleReynoldsNumber.h
emp/src/emp/TomiyamaDragCoefficientMethod.cpp
:9da194f17ec08bb20ad1be8df68b78ca137ab18a:

combustion/src/combustion/ReactingSpeciesTransportBasedModel.cpp
combustion/src/complexchemistry/TurbulentFlameClosure.cpp
:6a59f0be1e347a65e525e58742bb304639ea9bc4:

meshing/src/meshing/SurfaceMeshManipulation.cpp
physics/src/discretization/FvIndirectRegionInterfaceManager.cpp
physics/src/discretization/FvIndirectRegionInterfaceManager.h
physics/src/discretization/FvRepresentation.cpp
physics/src/discretization/FvRepresentation.h
:64b7f6d36b11b6cd94c20cad53463b7deef8c85a:

resourceclient/src/resourceclient/ResourcePool.cpp
resourceclient/src/resourceclient/ResourcePool.h
resourceclient/src/resourceclient/RestClient.cpp
resourceclient/src/resourceclient/RestClient.h
resourceclient/src/resourceclient/test/ResourcePoolTest.cpp

我想捕获两个组。第一组将提取所有提交 SHA1,另一组将提取文件名。

以下是我试过的表达方式:

(?:^:([A-Za-z0-9]+):|(?!^)\G)\n+([A-Za-z/.-]+)

https://regex101.com/r/3IBkPz/1

^:(\w+):\s+((?:\s*(?!:)[^\s]+)+)

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

想法?

【问题讨论】:

  • 可能不支持负前瞻,注意(?!:)[^\s]+ 可以被[^\s:][^\s]*更改
  • 当我使用这个 ^:(\w+):\s+((?:\s*[^\s:][^\s]*)+) 时,RegEx 步骤卡住了>

标签: regex pentaho pentaho-spoon pentaho-data-integration


【解决方案1】:

AFAIK(从 PDI-8.0 开始),Regex Evaluation 步骤不支持正则表达式 'g' 修饰符,您的正则表达式模式必须覆盖所有文本才能进行匹配。

例如:以下模式在正则表达式评估步骤中不会匹配任何内容:

:([0-9a-f]+):\s+([^:]+) 

但如果我在此模式前面加上 .* 并选择“启用 dotall 模式”:

.*:([0-9a-f]+):\s+([^:]+)

它将匹配最后一次提交(sha1 + 文件名)。您可以尝试将.* 移到末尾 原始模式将使您获得第一次提交。所以如果你想检索 带有 g 修饰符的提交的完整列表(sha1 + 文件名),这一步是 可能不是您的解决方案。

由于字段基本上由冒号''和换行分隔,您可以尝试以下方法:

  1. 使用 Split field to rows 步骤,Delimiter=':' 并在输出中包含 rownum,此 rownum 可用于过滤偶数为 sha1 而奇数为文件名的行

  2. 使用 Analytic Query 步骤创建一个 LEAD = 1 的新字段,因此现在您可以在同一行中获取 sha1 和文件名

  3. 使用CalculatorFileter步骤计算rownum/2的余数,只保留rownum为奇数的行

  4. 再次使用将字段拆分为行,使用“\n”(分隔符是正则表达式)将filenames 拆分为filename。您可能想要过滤掉 EMPTY 文件名,因为分隔符只支持一个 char

【讨论】:

    猜你喜欢
    • 2018-10-28
    • 1970-01-01
    • 2023-03-22
    • 2023-03-23
    • 2020-07-04
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多