return 使用正则表达式从字符串中匹配的第 n 个
return nth match from string using regex
我正在使用 Tableau 创建可视化效果,需要将 Regex 应用于我的数据集中的字符串值。我正在尝试使用正则表达式 return 此数据字符串的第 n 个匹配项:b29f3b2f2b2f3b3f1r2f3+b3x#。数据将始终在一行中,每次遇到字符 b、s、f 或 d 时,我都需要将数据分成子字符串,并且我需要匹配第 n 次出现的 returned。例如,当识别哪个数字与 return 匹配时,以下将匹配:
- 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 匹配到 return 正确的值,并尝试使用先行将后续值匹配到 return,但是可以'找到一个有效的正则表达式。任何帮助表示赞赏。
您可以使用这个正则表达式:
[bsfd][^bsfd]*
使用 'global'
标志。
这将创建以四个字母之一开头,后跟任意数量的其他字符的匹配项。
结果将是包含所有匹配项的 array
。请注意 Array
将以 index 0
(而不是 1)开头。
如果您有 gawk
,这会将输入字段划分为您的规范
$ awk -v FPAT='[a-f][0-9rx#+]+' '{=}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#
您的项目模式是 [bfsd][^bfsd]*
。
您可以使用 ^(?:.*?([bfsd][^bfsd]*)){n}
来获得您需要的,只需将 n
变量更新为您需要获得的数字即可。
此模式将为您提供第二个值:
^(?:.*?([bfsd][^bfsd]*)){2}
参见 regex demo。
详情
^
- 字符串开头
(?:.*?([bfsd][^bfsd]*)){2}
- 两次出现
.*?
- 任何 0+ 个字符,尽可能少
([bfsd][^bfsd]*)
- b
、f
、s
或 d
后跟除 b
、[=19 之外的 0+ 个字符=]、s
和 d
.
我正在使用 Tableau 创建可视化效果,需要将 Regex 应用于我的数据集中的字符串值。我正在尝试使用正则表达式 return 此数据字符串的第 n 个匹配项:b29f3b2f2b2f3b3f1r2f3+b3x#。数据将始终在一行中,每次遇到字符 b、s、f 或 d 时,我都需要将数据分成子字符串,并且我需要匹配第 n 次出现的 returned。例如,当识别哪个数字与 return 匹配时,以下将匹配:
- 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 匹配到 return 正确的值,并尝试使用先行将后续值匹配到 return,但是可以'找到一个有效的正则表达式。任何帮助表示赞赏。
您可以使用这个正则表达式:
[bsfd][^bsfd]*
使用 'global'
标志。
这将创建以四个字母之一开头,后跟任意数量的其他字符的匹配项。
结果将是包含所有匹配项的 array
。请注意 Array
将以 index 0
(而不是 1)开头。
如果您有 gawk
,这会将输入字段划分为您的规范
$ awk -v FPAT='[a-f][0-9rx#+]+' '{=}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#
您的项目模式是 [bfsd][^bfsd]*
。
您可以使用 ^(?:.*?([bfsd][^bfsd]*)){n}
来获得您需要的,只需将 n
变量更新为您需要获得的数字即可。
此模式将为您提供第二个值:
^(?:.*?([bfsd][^bfsd]*)){2}
参见 regex demo。
详情
^
- 字符串开头(?:.*?([bfsd][^bfsd]*)){2}
- 两次出现.*?
- 任何 0+ 个字符,尽可能少([bfsd][^bfsd]*)
-b
、f
、s
或d
后跟除b
、[=19 之外的 0+ 个字符=]、s
和d
.