我对正则表达式比较陌生,需要一个简单表达式的帮助。我正在使用 Pentaho 进行 ETL(字符串转换中的替换),并且我有列值,我需要将前导零添加到并解析出作为数据库导入的一部分的文本。到目前为止,我一直无法添加前导零。
该列称为Region,值为"region 8"、"region 10"、"region 11"。我的正则表达式是 ['Region'] 它将消除区域文本但产生结果 =“8”、“10”、“11”。我需要产生“08”、“10”、“11”的值。所以所有个位数的数字都必须有前导零。
我对正则表达式比较陌生,需要一个简单表达式的帮助。我正在使用 Pentaho 进行 ETL(字符串转换中的替换),并且我有列值,我需要将前导零添加到并解析出作为数据库导入的一部分的文本。到目前为止,我一直无法添加前导零。
该列称为Region,值为"region 8"、"region 10"、"region 11"。我的正则表达式是 ['Region'] 它将消除区域文本但产生结果 =“8”、“10”、“11”。我需要产生“08”、“10”、“11”的值。所以所有个位数的数字都必须有前导零。
分两步使用前瞻:
Regex 1: region (?=\d\D)
Replace 1: 0
Regex 2: region (?=\d\d)
Replace 2: (nothing)
向前看是不消耗的,因此您不必为反向引用等而烦恼。
s/^region[0-9][0-9]$/region
s/^region\([1-9]\)$/region0\1
您必须使用反向引用和多次检查,但这是可能的。这是一个使用 JavaScript 的示例:
"region 8".replace(/\D/g, '').replace(/^(\d)$/, '0$1');
//returns "08"
"region 18".replace(/\D/g, '').replace(/^(\d)$/, '0$1');
//returns "18"
"region 188".replace(/\D/g, '').replace(/^(\d)$/, '0$1');
//returns "188"
第一步是删除所有非数字字符.replace(/\D/g, '')
并将任何单个数字替换为 0 后跟自身。您可以使用反向引用 ( $1
) 来执行此操作:.replace(/^(\d)$/, '0$1')
Javascript 示例使用匿名函数来检查捕获的数字的值,0
如果它小于 10,则将 a 添加到返回值。例如:
column = "region 8";
column.replace(/region (\d+)/, function(s, p1){return parseInt(p1) < 10 ? '0' + p1 : p1});
该函数将整个匹配的字符串s
和捕获的部分p1
作为参数
一种 perl 方法:
while(<DATA>) {
chomp;
s/\D+//g;
printf("%02d\n", $_);
}
__DATA__
region 8
region 10
region 11
输出:
08
10
11