正则表达式从字符串中拉出一组数字

时间:2012-09-05 20:18:58

标签: regex

这是我的字符串:

a:1:{i:0;a:4:{s:1:"i";s:5:"19807";s:1:"c";s:19:"7025462932180014917";s:1:"a";
d:88.719999999999998863131622783839702606201171875;s:2:"ba";
d:88.719999999999998863131622783839702606201171875;}}

我只想提取以702546开头的部分,并在7之后的双引号之前结束。该数字可能是不同的长度,但始终以702546开头,并始终以引号结束。

所以我的最终选择是7025462932180014917

3 个答案:

答案 0 :(得分:0)

使用此正则表达式(?<=")(702546\d+)(?=")

如果你的正则表达式引擎不支持lookbehind使用这个正则表达式"(702546\d+)"匹配将在第1组

答案 1 :(得分:0)

基本的正则表达式是702546[^"]*来匹配任何类似的字符串,但你可能想要使用某种编程语言来实际将它们拉出来。

vnix$ grep -o '702546[^"]*' file

或者用脚本语言,就像这样;

perl -nle 'print $1 while m/(702546[^"]*)/g' file

你的问题描述让我相信这实际上并不是你应该做的事情。 What problem are you really trying to solve?

答案 2 :(得分:0)

根据您使用的技术/语言,这可能会有所不同,但基本上您可以使用类似的东西

(?<=")702546\d+(?=")

如果您的字符串中没有以702546开头的其他数字的风险,则第一个(?<=")可能会过度。

打破这个局面:

(?<=") // a zero-width assertion (lookbehind), so we will only match if preceded by double-quotes
 702546 // literal match
 \d+    // one or more additional digits
 (?=")  // another zero-width assertion (lookahead), so we will only match if followed by double-quotes

基本上,零宽度断言只是意味着值必须存在才能使匹配成功,但该值不会成为匹配的一部分。我们在这里使用它们是因为我们希望确保将值括在引号中,而不将引号作为匹配的一部分。