RegEx在Pentaho RegEx评估步骤中无处不在

时间:2019-05-07 14:05:53

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

我有几个RegEx可以在在线正则表达式网站上运行,但不能在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

有想法吗?

1 个答案:

答案 0 :(得分:1)

AFAIK(自PDI-8.0起),Regex Evaluation步骤不支持正则表达式' g '修饰符,您的正则表达式模式必须覆盖所有文本,以便能够比赛。

例如:以下模式与 Regex评估步骤中的任何内容都不匹配:

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

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

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

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

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

  1. 使用将字段拆分为行步骤,Delimiter =':'并在输出中包含rownum,此rownum可用于过滤偶数为sha1且奇数为文件名的行< / p>

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

  3. 使用 Calculator Fileter 步骤来计算rownum / 2的余数,并仅保留行数为奇数的行

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