2011-08-22 59 views
1

我需要一个正则表达式,只有当字母不是前面的字母时才会得到数字。数字正则表达式,如果之前没有字母

DoThis(0.5) // = 0.5 should be selected 
DoThis5(43) // = 43 should be selected, but not 5 

我设法写这/[0-9.]+\b/g但它会从DoThis5()选择“5”。这是我不想要的。

+0

btw,这里的所有(当前)答案都会匹配'............' - 哪个我上次检查时不是数字。 ;)如果这很重要,请使用'\ d +(?:\。\ d +)?'而不是'[\ d。] +'或'[0-9。] +'部分。 –

+0

@彼得 - 它的重要性。我想要 '。'只有在数字之前。我想出了这个'(\ b [0-9] +)|([。])+(\ d +)'但是我用正则表达式不好。有没有更好的方法来写这个? – cnotethegr8

回答

2

如果你有\b运营商可用,你为什么不做\b[0-9.]+(加号是贪婪的,所以会吃掉它找到的所有数字)。

编辑:用零或一个点和至少一个数字的十进制数更严格的正则表达式;

\b[0-9]+(\.[0-9]+)? 

目前不支持10.和.5。它需要一个支持分组括号的正则表达式引擎,以及可选部分的问号。 (sed的一些旧版本,例如Emacs要求你反斜杠括号和问号。)

+0

你可以使用'+?'使正则表达式无效 –

+1

这在这里没有用处。我试图解释为什么你最后不需要'\ b'。 – tripleee

+0

@Fabio,你为什么要勉强匹配(不认识)? –

1

使用负回顾后灌胃你使用正则表达式引擎支持它:

(?<!\w)[0-9.]+\b 
+0

您必须避开点,否则所有字符都有效 –

+3

不正确。在一个字符类中,点只匹配它自己。 – tripleee

+0

它看起来不像它支持我。但那真的会派上用场。哪些引擎确实支持“后视”? – cnotethegr8

0

如何:

/\([0-9.]+\)/ 

这将匹配的()

0

如果之间封闭的数字你不会使用负面看,这将工作:

/\([0-9.]+\)/ 


echo "DoThis5(43)" | egrep -o "\([0-9.]+\)"                     
(43) 
+0

即使它与字母相邻,它仍然会抓取任何数字。 – tripleee

+0

@tripleee,不,它匹配括号内的数字。 –

+0

你worng的tripleee .....看看我修改的答案 – ennuikiller

0

试试这个:

/[^\w]([\d\.]+)/ 

解释:

​​每个字符不是单词字符(如[^a-zA-Z]

[\d\.]每个数字(如[0-9])和点字符(逃脱)

+1

如果数字在行首,这将失败,但在这种情况下,这可能不是问题。 – tripleee

+0

@tripleee - 你是对的。这是一个问题。 – cnotethegr8

+0

这应该允许输入开头的数字也匹配:'(?:^ | [^ \ w])([\ d。] +)'? _(注意,不要在char类中跳过!)_ –

相关问题