我想写一个正则表达式,它可以提取字符串中0到360之间的数字。以下是示例:
Text: "Rotate by 360 degrees"
OP: 360
Text: "36 degrees degree rotation"
OP: 36
Text: "rotate 100"
OP: 100
Text: "rotate 6700"
OP: NA (as 6700 is out of range)
我想通过正则表达式实现
答案 0 :(得分:1)
枚举可能性:
\b([0-2]?[0-9]{1,2}|3[0-5][0-9]|360)\b
答案 1 :(得分:0)
[0-9]
\b
word boundary meta是为了确保诸如36000或l337之类的单词不匹配。一共有3个character class ranges † (一百个1-2 | 3,十个0-9 | 0-5和一个0-9)。 ?
是lazy quantifier,因为数百和数十不一定总是存在。管道|
和括号在{360}处为alternations,因为十位数不能为[0-6]
,因为这样做可以匹配361至369 ✱。
3[0-5][0-9] /* 300-359 */ |360 // 360
尽管可以防止超过360的可能性,但也可以防止获得160-199和260-299 ✱的范围。我们可以添加另一个替代:|
并稍微改变范围:
[1-2]?[0-9]?[0-9] // 0-299
所以回顾一下:
\b
防止相邻字符渗入比赛
[
... ]
涵盖了一个范围或一组文字匹配项
?
使前面的匹配为可选
(
... |
... )
是“或”门
\b([1-2]?[0-9]?[0-9]|3[0-5][0-9]|360)\b
† 与[0-9]
作为元序列的等效项是\d
。
✱感谢Master Toto指出范围缺陷。
var str = `
Rotate by 360 degrees
36 degrees rotation
Rotate 100
Turn 3600
Rotate 6700
270Deg
0 origin
Do not exceed 361 degrees or over.
Turn 180 degrees back
`;
var rgx = /\b([1-2]?[0-9]?[0-9]|3?[0-5]?[0-9]|360)\b/g;
var res = str.match(rgx, '$1');
console.log(JSON.stringify(res));