使用正则表达式从字符串返回第n个匹配项

时间:2018-11-05 20:18:59

标签: regex tableau regex-lookarounds data-cleaning

我正在使用Tableau创建可视化文件,并且需要将Regex应用于数据集中的字符串值。我正在尝试使用Regex返回此数据字符串的第n个匹配项:b29f3b2f2b2f3b3f1r2f3 + b3x#。数据将始终在一行中,每次遇到字符b,s,f或d时,我都需要将数据分解为子字符串,并且我需要匹配返回的第n个匹配项。例如,在确定要返回的数字匹配项时,将匹配以下内容:

  • n = 1匹配b29
  • n = 2匹配f3
  • n = 3匹配b2
  • n = 4个匹配f2
  • n = 5匹配b2
  • n = 6匹配f3
  • n = 7匹配b3
  • n = 8个匹配f1r2
  • n = 9匹配f3 +
  • n = 10匹配b3x#

我可以使用bfsd(?= [bfsd])获得n = 1个匹配项以返回正确的值,并尝试使用先行方式获取后续值以返回,但是找不到有效的正则表达式。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式:

[bsfd][^bsfd]*

使用'global'标志。

这将创建以四个字母之一开头,后跟任意数量其他字符的匹配项。

结果将是array,其中包含所有匹配项。请注意,Array将以index 0(而不是1)开头。

答案 1 :(得分:0)

如果您有gawk,这会将输入字段划分为您的规范

$ awk -v FPAT='[a-f][0-9rx#+]+' '{$1=$1}1'

$ echo "b29f3b2f2b2f3b3f1r2f3+b3x#" | 
  awk -v FPAT='[a-f][0-9rx#+]+' '{for(i=1;i<=NF;i++) print i " -> " $i}'


1 -> b29
2 -> f3
3 -> b2
4 -> f2
5 -> b2
6 -> f3
7 -> b3
8 -> f1r2
9 -> f3+
10 -> b3x#

答案 2 :(得分:0)

您的项目模式为[bfsd][^bfsd]*

您可以使用^(?:.*?([bfsd][^bfsd]*)){n}来获取所需的内容,只需将n变量更新为所需的数字即可。

此模式将为您提供第二个值:

^(?:.*?([bfsd][^bfsd]*)){2} 

请参见regex demo

详细信息

  • ^-字符串的开头
  • (?:.*?([bfsd][^bfsd]*)){2}-两次出现
    • .*?-任意0个以上的字符,尽可能少
    • ([bfsd][^bfsd]*)-bfsd,后跟0个字符,比bfsd
相关问题