如何使用正则表达式在Apache Nifi中查找格式化数字序列?

时间:2018-05-16 20:56:11

标签: regex csv apache-nifi

我想找到使用Apache Nifi这种带有大量文本的CSV文本:

NNNN?NN

其中n是0到9之间的数字,并且?是一个字面问号。

一个真实的例子是:

8764?23

它始终在?之前有4位数字,在之后有2位数字。

如何做到这一点?

3 个答案:

答案 0 :(得分:3)

简单起见:

\d{4}\?\d{2}

但这也会在8764?2398764?23等较长的字符串中匹配8764?234

如果您需要在CSV中找到与相匹配的完全匹配项,则需要更复杂的正则表达式:

(?:^|,)\s*(\d{4}\?\d{2})\s*(?:,|$)

乍一看这看起来有点奇怪,所以让我们分解一下:

  • (?:^|,)使用(something|something else)语法允许选择两个不同的内容 - 这里允许字符串^的开头或逗号,。开头的?:会将此表达式排除在捕获组之外。
  • \s*允许在匹配的表达式之前显示任意数量的空格(即零个或多个空格,制表符等)。
  • (\d{4}\?\d{2})指定4个数字\d{4},后跟问号\? (需要进行转义,以区别于正则表达式?,意味着0或1次出现),然后又有2位数\d{2}。周围的括号()用于将其指定为捕获组。
  • \s*在匹配的表达式后允许更多的空格。
  • (?:,|$)允许使用逗号,或字符串$的结尾,?:将其排除为捕获组。

<强>演示

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

<强>用法

以上内容可与Nifi的ExtractText一起使用,以获得每场比赛的第一个捕获组。由于只有感兴趣的捕获组而不是匹配的其余部分,&#34;包括捕获组0&#34;可以设置为false。大概是&#34;启用多线模式&#34;和&#34;启用重复捕获组&#34;应该设置为true。

进一步考虑

以上假设8764?23与CSV字符串中的值完全相同。但也许你需要允许"8764?23"?或者可能是'8764?23'_8764?23_甚至ABC8764?23DEF等其他人?这里有太多可能的变体,只有一种尺寸适合所有,所以请在评论中回复说明上述要求是否符合您的需求。

答案 1 :(得分:2)

以下是您的正则表达式:\d\d\d\d\?\d\dtool where you can use it(此处更多complicated版本)

答案 2 :(得分:0)

这是您需要的正则表达式。

(\d{4}\?\d\d)