3

我对正则表达式比较陌生,需要一个简单表达式的帮助。我正在使用 Pentaho 进行 ETL(字符串转换中的替换),并且我有列值,我需要将前导零添加到并解析出作为数据库导入的一部分的文本。到目前为止,我一直无法添加前导零。

该列称为Region,值为"region 8""region 10""region 11"。我的正则表达式是 ['Region'] 它将消除区域文本但产生结果 =“8”、“10”、“11”。我需要产生“08”、“10”、“11”的值。所以所有个位数的数字都必须有前导零。

4

5 回答 5

2

分两步使用前瞻:

Regex 1:   region (?=\d\D)
Replace 1: 0

Regex 2:   region (?=\d\d)
Replace 2: (nothing)

向前看是不消耗的,因此您不必为反向引用等而烦恼。

于 2012-12-04T01:55:02.123 回答
0
s/^region[0-9][0-9]$/region
s/^region\([1-9]\)$/region0\1
于 2012-12-03T23:33:00.520 回答
0

您必须使用反向引用和多次检查,但这是可能的。这是一个使用 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')

于 2012-12-03T23:47:06.253 回答
0

Javascript 示例使用匿名函数来检查捕获的数字的值,0如果它小于 10,则将 a 添加到返回值。例如:

column = "region 8";

column.replace(/region (\d+)/, function(s, p1){return parseInt(p1) < 10 ? '0' + p1 : p1});

该函数将整个匹配的字符串s和捕获的部分p1作为参数

于 2012-12-04T11:02:42.153 回答
0

一种 perl 方法:

while(<DATA>) {
    chomp;
    s/\D+//g;
    printf("%02d\n", $_);
}

__DATA__
region 8
region 10
region 11

输出:

08
10
11
于 2012-12-04T12:16:32.857 回答