用于验证比率的正则表达式,例如Y39.29 / 28h

时间:2013-12-21 23:30:41

标签: javascript php regex

我正在尝试编写一个必须遵守以下规则的正则表达式:

Y120.001/100.232k
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
| | | | | | | | This k may be any letter, is not required
| | | | | | | Another number if there was a dot
| | | | | | A dot, not required
| | | | | A number with at least one digit, not required if a letter follows
| | | | Always a slash
| | | If there's a dot, digits can follow
| | A dot, not required
| A number, at least one digit
Always Y

这些字符串应该有效:

  • Y120.001 / 1K
  • Y1 / h的
  • Y2039 / 100
  • Y29 / 47.0

这些应该不起作用:

  • x203 / 493s(开头不是Y)
  • Y / 39x(Y后没有数字)
  • Y83839(下半场失踪)
  • Y78 / 29(最后一封信失踪)

这是我的早期尝试,但它在PHP中不起作用:

/^\$*(\d)*(.*(\d))\/*(.*(\d))*.$

8 个答案:

答案 0 :(得分:2)

这种模式应该有效:

^Y\d+(\.\d*)?/(\d+(\.\d*)?[a-z]?|[a-z])$

Demonstration

答案 1 :(得分:1)

在javascript中

re=/^Y\d+(\.\d+)?\/([a-z]$|\d+(\.\d+)?[a-z]?$)/

"Y120.001/1k Y1/h Y2039/100 Y29/47.0".split(" ").map(function(s) { return re.test(s) })
> [true, true, true, true]

"x203/493s Y/39x Y83839 Y78/29".split(" ").map(function(s) { return re.test(s) })
> [false, false, false, true]

这接受Y78/29,因为尾随字母是可选的。

答案 2 :(得分:1)

经过多次迭代以纠正评论的缺点:

/^Y\d+(?:\.\d+)?\/(?:(?:\d+(?:\.\d+)?)[A-Za-z]?|[A-Za-z])$/

Demonstration

旧答案:

这是一个效果很好的完全特定的版本。

/^Y\d+(?:\.\d+)?\/(\d+(?:\.\d+)?)?[A-Za-z]?$/

jsfiddle

中编辑进行后续测试

答案 3 :(得分:0)

^Y\d+\.?\d*/((\d+\.?\d*)[a-zA-Z]?|(\d+\.?\d*)?[a-zA-Z])$

您可以从here检查正则表达式的解释。

答案 4 :(得分:0)

如果我了解您的规范的细微差别

\bY\d+(?:\.\d*)?/(?:[A-Za-z]|(?:\d+(?:\.\d+)?[A-Za-z]?))\b

我理解你的规范要包括如果第一个点存在,则以下数字是可选的;但如果存在第二个点,则必须至少有一个后续数字。其他人似乎以不同的方式解释了您的部分要求。

答案 5 :(得分:0)

此模式应该有效Y[\d.]+\/[\d.]*[a-z]? Demo

答案 6 :(得分:0)

下一个怎么样?

var r = /^Y\d+(\.\d+)?\/(\d+(\.\d+)?|(\d+(\.\d+)?)?[A-Za-z])$/;
console.log(true  === r.test('Y120.001/1k')); // true
console.log(true  === r.test('Y1/h'));        // true
console.log(true  === r.test('Y2039/100'));   // true
console.log(true  === r.test('Y29/47.0'));    // true
console.log(false === r.test('x203/493s'));   // true
console.log(false === r.test('Y/39x'));       // true
console.log(false === r.test('Y83839'));      // true

答案 7 :(得分:-1)

试试这个:

/Y\d+\.?\d*\/\d+\.?\d*\w?/