跳过多个号码

时间:2013-09-05 20:29:01

标签: regex

我正在尝试将Regex用于我正在为工作做的项目。 我有一组看起来像这样的数字:

23    14    62  -121    98   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
24    13    64  -118   101   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
19    10    65  -124    93   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
19    11    62  -130    93   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
16     2    65  -127    83   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
18     1    68  -127    86   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
29    -1    64  -129    92   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
22     2    63  -131    87   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
16    13    62  -130    91   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
15     6    66  -131    87   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
16     2    62  -137    80   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
16    -5    63  -133    74   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
24    -1    60  -135    83   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
15    11    59  -137    86   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
11     8    64  -131    83   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
19    10    64  -130    92   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
20    11    65  -136    96   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
20     8    59  -136    87   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
18    13    59  -135    90   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
18    10    60  -138    88   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
23     6    60  -133    88   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
20    10    57  -127    87   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
23     4    61  -127    88   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
14    -3    63  -131    75   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
16    -5    62  -129    73   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
25    -6    62  -127    80   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
21     2    60  -129    83   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
14     3    65  -133    81   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
14     8    64  -132    86   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
19    11    59  -131    89   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
28     5    59  -129    93   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
29    -3    56  -130    82   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
24     0    58  -128    82   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
28    12    65  -128   104   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
25     4    65  -123    94   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
17    -1    61  -126    77   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...
18     2    62  -130    82   -0.0   -0.1    0.0   -0.2 165 60.00 .... ...

我想获得每行(165)中的第10个数字,只有一个或两个正则表达式语句。该数字偶尔从165变化,因此我无法对其进行硬编码。 到目前为止,我有:

([+-]{0,1}[0-9]{1,5})
([+-]{0,1}[0-9]{1,5})
([+-]{0,1}[0-9]{1,5})
([+-]{0,1}[0-9]{1,5})
([+-]{0,1}[0-9]{1,5})
([+-]{0,1}[0-9]{1,}[.]{0,1}[0-9]{0,5})|([+-]{0,1}[.]{1,1}(?=[0-9])[0-9]{0,5}))
([+-]{0,1}[0-9]{1,}[.]{0,1}[0-9]{0,5})|([+-]{0,1}[.]{1,1}(?=[0-9])[0-9]{0,5}))
([+-]{0,1}[0-9]{1,}[.]{0,1}[0-9]{0,5})|([+-]{0,1}[.]{1,1}(?=[0-9])[0-9]{0,5}))
([+-]{0,1}[0-9]{1,}[.]{0,1}[0-9]{0,5})|([+-]{0,1}[.]{1,1}(?=[0-9])[0-9]{0,5}))
([+-]{0,1}[0-9]{1,5})

这显然不是1或2步,而是10加上它给了我9分我不想要的。 有没有办法只用1或2个语句来解决这个问题?

5 个答案:

答案 0 :(得分:1)

编辑:如果您不必使用正则表达式,但可以使用Awk,您可以使其更简单:

cat file.dat | awk '{print $10}'

这是我的变体:

^(?:[\S-\.]+\s+){9}(\S+)

您的号码(即165)将存储在第一个捕获组中(即$1,具体取决于您使用的语言)。

说明:

^             // Beginning of the line
(?:           // Do not capture this group (we're not interested in it)
  \S+         //   Any non-space character - one or more times
  \s+         //   Followed by a white-space character (one or more)
){9}          // Repeat the above nine times
(\S+)         // Any non-white space characters (our tenth number)

Perl中的用法示例:

cat file.dat | perl -ne 'print $1 if s/(?:\S+\s+){9}(\S+)//'

答案 1 :(得分:1)

如果所有行中的所有列都是固定宽度,则可以执行以下操作:

^.{55}(\d+)

请注意,此设计用于匹配“165”之类的数字,没有符号或小数组件。这可能更灵活:

^.{55}([+-]?\d+(?:.\d+)?)

答案 2 :(得分:0)

^\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)

或者,甚至更好(谢谢@SamIAm!):

^(\S+\s+){9}(\S+)

答案 3 :(得分:0)

我想出了这个正则表达式

/^.*?(?:[\d\.]+[^\d\.]+?){9}([\d\.-]+)/

http://rubular.com/r/0cwhaL92aw

答案 4 :(得分:0)

您没有指定您正在使用的语言/工具,因此这是一个Java示例:

// Split the input into each row:
final String rows[ ] = INPUT.split( "\\n" );

// Iterate through each row:
for ( final String row : rows )
{
  // Split the row into components separated by spaces:
  final String components[ ] = row.split( "\\s+" );

  assert components.length < 9 : "There is no 10th number!";

  final double number = Double.parseDouble( components[ 9 ] );
}