正则表达式,动态数字

时间:2011-04-17 13:45:23

标签: regex

我提供的正则表达式将选择字符串72719

正则表达式:

(?<=bdfg34f;\d{4};)\d{0,9}

文字示例:

vfhnsirf;5234;72159;2;668912;28032009;4;
bdfg34f;8467;72719;7;6637912;05072009;7;
b5g342sirf;234;72119;4;774582;20102009;3;

即使数字8467;更改为84677;846777;,如何重写表达式以选择该字符串?有可能吗?

4 个答案:

答案 0 :(得分:1)

以下是我通常在正则表达式中描述“字段”的方法:

[^;]+;[^;]+;([^;]+);

这意味着“不是分号的东西,后跟分号”,它描述了每个字段。做两次。然后第三次选择它。

您可能需要调整正在执行此正则表达式的任何语言的语法。

另外,如果这只是磁盘上的数据文件并且您正在使用GNU工具,那么有一种更简单的方法:

cat file | cut -d";" -f 3

答案 1 :(得分:1)

匹配第一个数字,最少4位

(?<=bdfg34f;\d{4,};)\d{0,9}

并匹配第一个数字与1个或更多长度

(?<=bdfg34f;\d+;)\d{0,9}

或仅在长度介于4和6之间时匹配第一个数字

(?<=bdfg34f;\d{4,6};)\d{0,9}

答案 2 :(得分:1)

首先,在询问正则表达式问题时,您应该始终指定您正在使用的语言。 假设您使用的语言不支持可变长度的lookbehind(并且大多数不支持),这里有一个可行的解决方案。您的原始表达式使用固定长度的lookbehind来匹配您想要的值之前的模式。但是现在这个前面的文本可能是可变长度的,所以你不能使用后面的外观。这没问题。只需正常匹配前面的文本并捕获要保留在捕获组中的部分。这是一个经过测试的PHP代码片段,它从字符串中获取所有值,将每个值捕获到捕获组$1中:

$re = '/^bdfg34f;\d{4,};(\d{0,9})/m';
if (preg_match_all($re, $text, $matches)) {
    $values = $matches[1];
}

变化是:

  • 删除了lookbehind组。
  • 添加了线锚起点并设置了多线模式。
  • \d{4} “正好四个”更改为\d{4,} “四个或更多”
  • 添加了所需值的捕获组。

答案 3 :(得分:0)

这是一个简单的文本解析问题,可能不会强制使用正则表达式。

你可以逐行输入并分成';',即(在php中,我不知道你在做什么)

foreach (explode("\n", $string) as $line) {
    $bits = explode(";", $line);
    echo $bits[3]; // third column
}

如果这确实存在于文件中并且您碰巧使用的是PHP,那么使用fgetcsv会更好。

无论如何,缺少上下文,但最重要的是我不认为你应该使用正则表达式。