用于将字符串与ruby中的数字匹配的正则表达式

时间:2018-04-19 10:44:16

标签: ruby regex

我有一个字符串如下。

"Included in PTA fees" or "Included in PTA fees 33$" or "Included in PTA fees $60"

我需要匹配此字符串,搜索PTA费用/费用以及是否还附加任何费用(数字)。

需要寻找" PTA费用"以及任何给定字符串中的费用值,并返回true。

所以它应该为

返回true
"Included in PTA fees 33$" and
"Included in PTA fees $60"

"Included in PTA fees"

应返回false

我尝试使用下面的正则表达式。但是对于

,它返回true
"Included in PTA fees"

/#{PTA_FEE[0-9]}/i.match?(value)

4 个答案:

答案 0 :(得分:2)

这个正则表达式应该可行

^.*PTA fees?(?=.*(?:(?:\d+\s*\$)|(?:\$\s*\d+)))

正则表达式细分

(?i) #Ignore Case
^ #Start of string
.*
PTA fees? #Match the string with fee(s)
(?=.* #Lookahead

  (?: #Non capturing group

     (?:\d+\s*\$) #Match digit followed by $

        | #Alternation

     (?:\$\s*\d+) #Match $ followed digit

  ) #End non capturing group
) #End lookahead

rubular demo

答案 1 :(得分:2)

您只需要\S+作为正则表达式的结尾部分:

str =~ /Included in PTA fees? \S+/
  • \S+一个或多个非空白字符
  • ?可选匹配

或更确切地说:

str =~ /Included in PTA fees? (?:\d+\$|\$\d+)/

Live demo

答案 2 :(得分:1)

我会去Included in PTA fees(?=.*?(\d+(?:\.\d+)?));这也将费用分组并考虑浮点值。但它没有考虑任何自由形式的否定,例如“包含在PTA费用中”或“包含在PTA费用中”。

它无视美元符号;由于您的描述不完整,并且您所匹配的内容看起来像可能在语法上不正确的内容,因此美元符号可能会\$\s*\d+|\d+\s*\$。美元价值可能有一千个分隔符吗?

当问题未明确时,您可以将这个问题的答案复杂化。

答案 3 :(得分:1)

你可以使用这个:

^Included in PTA fees\s*(\$\d+|\d+\$)

检查字符串是否以Included in PTA fees开头,然后允许在(\$\d+)之前或之后带有美元符号的费用号码(\d+\$

Demo