2012-07-24 115 views
1

学习正则表达式,但这个让我很头疼。我需要匹配一个浮点数(要么是.要么是,作为小数点),它必须以下列字符结尾:€/gJavaScript正则表达式以字符串结尾的浮点数

有效的匹配应该是例如:

  • 40€/g
  • 43.33€/g
  • 40,2€/g
  • 40.2€/g
  • 38.943€/g

欣赏帮助..

+3

到目前为止您尝试了哪些表情?你到底有什么问题? http://www.regular-expressions.info/是开始学习正则表达式的好地方。 – 2012-07-24 11:49:58

+1

@TimPietzcker他说'.'或','为小数点,所以我认为不是:) – epoch 2012-07-24 11:50:32

+1

你试过什么样的表情,出了什么问题?你有[演示我们可以玩](http://jsfiddle.net/)?帮助我们来帮助你。 – 2012-07-24 11:50:32

回答

6

正则表达式看起来像:

\d+(?:[.,]\d+)?€/g 

在Javascript中,作为一个正则表达式对象(注意,正斜杠需要转义):

/\d+(?:[.,]\d+)?€\/g/ 

这里有一个细分每个部分的功能:

\d+ # one or more digits 
(?: # ... don't capture this group separately 
[.,] # decimal point 
\d+ # one or more digits 
)? # make the group optional 
€/g # fixed string to match 

如果您想允许类似.123€/ g是有效的,以及,你可以使用:

(?=[.,]|\d)(?:\d+)?(?:[.,]\d+)?€/g 

也就是说,两个数字的组是可选的,但至少有一个必须存在(这使用lookahead,这是需要一些技巧)。

请注意,这也会匹配'word2€/ g'等结构。如果要防止出现这种情况,请使用(?<=^|\s)(如果前面有空格或字符串的起始位置,则匹配)以(?=$|\s)(如果后跟空格或字符串末尾,则匹配)结束。

完全成熟的版本:

(?<=^|\s)(?=[.,]|\d)(?:\d+)?(?:[.,]\d+)?€/g(?=$|\s) 
+0

伟大的答案,谢谢!它完美地工作。如果我希望匹配的浮点数以“€/ g”或“/ g”结尾? 尝试过,但似乎没有工作: /\ d +(?:[。,] \ d +)?[(€\/g)|(\/g)]/ – jpaw 2012-07-24 12:28:37

+1

@urbffe:'[(€ \/g)|(\/g)]'是一个字符类,它只会匹配**提供的字符**。即它与[()€/ g]'相同。我想你想要'(€\/g | \/g)'。 – 2012-07-24 12:42:08

+0

你是对的!这样可行。谢谢一堆! – jpaw 2012-07-24 13:20:14

2
\d+([.,]\d+)?€/g 

应该工作,我猜。

+0

你必须在正则表达式中转义'/',但是表达式看起来很好。 – 2012-07-24 11:59:17

+1

作为我自己的一个规则,我从来没有像在语言中那样使用文字形式的正则表达式。这简化了很多,特别是对于Java(没有文字字符串)或PHP(你必须使用字符串*和*分隔符 - 疯狂)。我通常假设读者对这种语言有足够的了解,以便将正则表达式本身适用于他们正在使用的语言:-) – Joey 2012-07-24 12:16:02

+0

*我通常假设读者已经足够了解该语言,从而使正则表达式本身适应它们所使用的语言使用* ...我希望它是如此:)然而,我喜欢你的态度......快乐的编码! – 2012-07-24 12:19:29

0

你确定你需要一个正则表达式吗?使用可用的内置浮点解析可能会更容易:在欧元符号之前采取任何措施,将逗号标准化为小数(反之亦然,无论结束工作),然后尝试使用Number函数进行解析。请注意,您需要检查转换是否与Number.isNaN函数一起工作。

另一种可能性是只使用parseFloat函数。由于它会忽略数字后的任何字符,因此它会将"40€解析为40.0。但是,它可能不是你想要的,因为它也允许诸如"40a""40b"之类的东西。

+0

感谢您的回答。我明白你的意思,但这不完全是我要找的。我正在搜索一个大字符串,用于附加具体的€/ g的浮点数字。 – jpaw 2012-07-24 12:25:38

+0

即使这样,你可以不用做一个复杂的正则表达式,而是搜索“看起来像一个数字”(但只需要一个更简单的正则表达式),然后使用内置解析函数对列表进行过滤。 – hugomg 2012-07-24 12:31:48

相关问题