2013-07-20 25 views
-1

我有一个Perl脚本,它匹配以(字母数字或下划线)开头的行,后跟任意数量的空格,后跟另一个(字母数字或下划线)。我现在意识到,对于第二个(字母数字或下划线),我还需要包括这可能是负数(例如-50)的可能性。我怎样才能做到这一点?在perl中匹配负数和非负数

原始代码:

if (/^\w[\s]+\w/ and not /^A pdb file/) { 
...doSomething 
} 

未成功尝试的东西,如:

if (/^\w[\s]+\-*w/ and not /^A pdb file/) 
if (/^\w[\s]+\-{0,1}w/ and not /^A pdb file/) 
if (/^\w[\s]+\w|-\w/ and not /^A pdb file/) 

感谢。

+1

你想也张贴样本输入和期望的结果? – thb

+0

奇怪的是,前2个不起作用; FWIW你不需要逃避'-',因为它在字符类别之外没有任何特殊之处。 – doubleDown

+0

@thb:谢谢,我会的,但它现在正在工作:o)。 DoubleDown:哦,对,谢谢你,我会记住的! – LanneR

回答

1

这是否符合您的需求?

/^\w+\s*-?\w+$/ 

它说比赛:

  • \w+:任意数量的字母数字字符(包括下划线)
  • \s*:任意数量的空格(如果你需要至少在一个空间,使用\s+
  • -?:可选短划线
  • \w+:任意数量的字母数字字母ers(包括下划线)。如果这组字符只能是数字,则使用\d+代替。
+0

当然。非常感谢! – LanneR

+0

+1。从技术上讲,我不确定这是否与OP的规格完全匹配(因为它会匹配例如'12-bar',即使'-bar'不是“负数”),但它似乎是保留OP目前的做法。 – ruakh

+0

@ruakh:同意/谢谢。我更新了答案。 –

-2

尝试:

m{ 
    \A   # start of the string 
    \w   # a single alphanumeric or underscore 
    \s+  # one or more white space 
    (?:  # non-capturing grouping 
     \-  # a minus sign 
     \d+ # one or more digits 
    )?   # match entire group zero or one time 
    \w   # a single alphanumeric or underscore 
}msx;