我有以下表达式:
^ \ W(\ S(+ | - | / | *)\ S \ W)* $
这简单地看起来匹配一个数学表达式,其中提示用户输入由基本运算符分隔的术语(例如:价格+税)
用户可以输入超过2个条款和一个运营商(例如:价格+税+更多)
我在Rubular http://rubular.com/
中测试了这个表达式使用条款:
a + a(MATCH)
a + a + a(MATCH)
a + a +
a +
a a
a + a a
一切正常,但是当我在Ruby中使用它时它不起作用!
expression =〜/ ^ \ w(\ s(+ | - | / | *)\ s \ w)* $ /
我开始分开选择表达式并注意到如果我删除行符号的开头,它会找到匹配但不正确。
a + a(MATCH)
a(MATCH)< - 这是不正确的
为什么这个表达式在Ruby代码中不起作用? (我使用的是Ruby 1.8.7 p174)
答案 0 :(得分:0)
这对我来说非常有用:
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 :(得分:0)
这应该有效:/^(\w+)(?:\s*(\+|\-|\*|\/)\s*(\w+))*$/
我为反向引用添加了一些捕获
答案 2 :(得分:0)
您可以尝试:
/^\w(\s(\+|-|\/|\*)\s\w)*$/
答案 3 :(得分:0)
我应该使用\ w +,因为我可以收到多个角色的条款......
^ \ W +(\ S(+ | - | / | )\ S \ W +) $
感谢大家的回复。