2010-05-08 152 views
0

我有以下表现:Ruby的正则表达式不匹配的有效表达

^\ W(\ S(+ | - |/| *)\ S \ W)* $

这只是看起来匹配的数学表达式,其中用户被提示通过基本运算符分开的术语(例如:价格+税)

用户可以输入不仅仅是2条款和一个操作者以上(例如:价格+税+ moretax)

我在Rubular中测试了这个表达式http://rubular.com/

与术语:

A + A(MATCH)
A + A + A(MATCH)
A + A +
一个+
AA
一个+ AA

一切的作品,但是当我在Ruby中使用它时,它不起作用!

表达=〜/^\ W(\ S(+ | - |/| *)\ S \ W)* $/

我开始分开采摘的表达,发现如果我删除的开始它会发现匹配但是不正确。

A + A(MATCH)
一个一(MATCH)< - 这是不正确的

为什么不Ruby代码工作这体现在哪里? (我使用Ruby 1.8.7 P174)

+0

请在代码行之前放置四个空格,以使代码突出显示。 – 2010-05-09 23:50:13

回答

0

我应该用\ w +,我可以收到多个字符的条款......

^\ w +(\ S(+ | - |/| )\ s \ w +) $

感谢大家的回复。

+1

您仍然会收到错误消息,因为您没有转义+和*。^\ w +(\ s(\ + | - | \/| \\ *)\ s \ w +)$也许? – 2010-05-08 01:26:50

0

这IRB工作对我来说:

expression =~ /^\w(\s(\+|-|\/|\*)\s\w)*$/ 

我跟你的条件进行了测试:

irb(main):019:0> expressions = ["a + a", "a + a + a", "a + a +", 
       "a +", "a a", "a + a a"] 
=> ["a + a", "a + a + a", "a + a +", "a +", "a a", "a + a a"] 
irb(main):023:0> expressions.each { |expression| 
irb(main):024:1* puts expression =~ /^\w(\s(\+|-|\/|\*)\s\w)*$/ 
irb(main):025:1> } 
0 
0 
nil 
nil 
nil 
nil 
+1

当我看到这个测试时灯亮了......我正在测试单个字符,但我正在接收单词。我应该使用\ w + – 2010-05-08 01:21:14

0

这应该工作:/^(\w+)(?:\s*(\+|\-|\*|\/)\s*(\w+))*$/ 我加一些捕捉反向参照