我提供的正则表达式将选择字符串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;
,如何重写表达式以选择该字符串?有可能吗?
答案 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];
}
变化是:
\d{4}
“正好四个”更改为\d{4,}
“四个或更多”。答案 3 :(得分:0)
这是一个简单的文本解析问题,可能不会强制使用正则表达式。
你可以逐行输入并分成';',即(在php中,我不知道你在做什么)
foreach (explode("\n", $string) as $line) {
$bits = explode(";", $line);
echo $bits[3]; // third column
}
如果这确实存在于文件中并且您碰巧使用的是PHP,那么使用fgetcsv会更好。
无论如何,缺少上下文,但最重要的是我不认为你应该使用正则表达式。