Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于验证Y39.29/28h等比率的正则表达式_Javascript_Php_Regex - Fatal编程技术网

Javascript 用于验证Y39.29/28h等比率的正则表达式

Javascript 用于验证Y39.29/28h等比率的正则表达式,javascript,php,regex,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 re

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

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
这些字符串应该起作用:

^Y\d+(\.\d*)?/(\d+(\.\d*)?[a-z]?|[a-z])$
  • Y120.001/1k
  • Y1/h
  • Y2039/100
  • Y29/47.0
这些措施不应奏效:

  • x203/493s(开始时不是Y)
  • Y/39x(Y后无编号)
  • Y83839(下半段缺失)
  • Y78/29(最后一个字母缺失)
这是我早期的尝试,但在PHP中不起作用:

/^\$*(\d)*(.*(\d))\/*(.*(\d))*.$
试试这个:

/Y\d+\.?\d*\/\d+\.?\d*\w?/
在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
,因为尾随字母是可选的。

此模式应适用于:

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


在多次迭代后,您可以从中检查正则表达式的解释,以纠正已注释的缺点:

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

旧答案:

这是一个完全特定的版本,运行良好

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

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

中编辑后续测试

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

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

此模式应该适用于
Y[\d.]+\/[\d.]*[a-z]?
以下模式如何

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

您写道最后一个字母不是必需的,第二个数字也不是必需的,这是否意味着Y123/是一个有效字符串?@klarki关于它所说的数字“如果后面有字母,则不需要”。我的理解是这样的:你可以不带字母也可以不带数字,但不能同时带字母和数字,也就是说,
Y123/1
->有效,
Y123/x
->有效,
Y123/
->->无效。是否有解决方案..我更新了一个小的语法更改,以允许“Y1/h”匹配。Nice:)新版本也匹配
Y1/
,这似乎违反了规则。在演示中添加了一些边缘情况的更多测试。规则是否使Y1./12.1k有效?这也匹配
Y1/
,虽然没有作为示例输入提供,但似乎违反了规则。匹配
Y120./1k也
(后面没有数字的点)!如果出现“Y1/h”(问题中提到)和“Y123/k”(根据所述规则有效),则此操作失败。