使用正则表达式在字符串中查找0-360

时间:2018-12-26 11:45:16

标签: regex

我想写一个正则表达式,它可以提取字符串中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)

我想通过正则表达式实现

2 个答案:

答案 0 :(得分:1)

枚举可能性:

\b([0-2]?[0-9]{1,2}|3[0-5][0-9]|360)\b

答案 1 :(得分:0)

RegEx编号范围[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));