首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要正则表达式,它应该只允许有效的页码,如1,2,3,4-5,每个页码的最大长度为3位(1-999)

需要正则表达式,它应该只允许有效的页码,如1,2,3,4-5,每个页码的最大长度为3位(1-999)
EN

Stack Overflow用户
提问于 2019-08-08 06:55:44
回答 2查看 229关注 0票数 3

我的文本框应该只允许有效的页码,例如

代码语言:javascript
运行
复制
1,2,3,4-9 
2,8
1-3,5
5-7
7,8-6
1-3,5
1,2
2,3,4,5-6,7
10
11-15
22,25

代码:

代码语言:javascript
运行
复制
// Regex
var pageNumberHypenComma = new RegExp("^[0-9]+(?:,[0-9-]+)*(?:-[0-9,]+)*$");  

// Value of Page Numbers
var txtMemberPages = "1,2,3,4-9,12";

// Regex checking
if (!pageNumberHypenComma.test(txtMemberPages)) {
    alert('Invalid Page Number(s)'); 
    return false;
}

上述正则表达式不起作用。需要帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-08 07:02:02

你所提问题的额外要求是:

  • 值不能为零。
  • 值应介于1至125之间。
  • 范围只应出现在两个数字之间。

使用

代码语言:javascript
运行
复制
var rng = '(?:[1-9]|[1-9]\\d|1[01]\\d|12[0-5])'; // This is a number from 1 to 125
var pageNumberHypenComma = new RegExp("^" + rng + "(?:-" + rng + ")?(?:," + rng + "(?:-" + rng + ")?)*$");

regex演示

详细信息

  • ^ -字符串的开始
  • (?:[1-9]|[1-9]\d|1[01]\d|12[0-5]) - 1 to 125
  • (?:-(?:[1-9]|[1-9]\d|1[01]\d|12[0-5]))? -一个可选的组匹配-和从1125的数字
  • (?:,(?:[1-9]|[1-9]\d|1[01]\d|12[0-5])(?:-(?:[1-9]|[1-9]\d|1[01]\d|12[0-5]))?)* -0或更多序列
    • , -逗号
    • (?:[1-9]|[1-9]\d|1[01]\d|12[0-5]) -从1125的一个数字
    • (?:-(?:[1-9]|[1-9]\d|1[01]\d|12[0-5]))? -一个可选的-序列和从1125的数字

  • $ -字符串的末端。
票数 4
EN

Stack Overflow用户

发布于 2019-08-08 07:10:57

如果页面的范围只能包含单个连字符,则可以匹配1+数字,然后是可选部分,以匹配连字符和1-3位数字。

然后重复这个模式,0+的前面加上一个逗号。

代码语言:javascript
运行
复制
^\d{1,3}(?:-\d{1,3})?(?:,\d{1,3}(?:-\d{1,3})?)*$

解释

  • 字符串的^启动
  • \d{1,3}(?:-\d{1,3})?匹配1-3位数字,并可选择匹配-和1-3位数字。
  • (?:非捕获群
    • ,\d{1,3}(?:-\d{1,3})?匹配逗号,1-3位数字,并可选择匹配-和1-3位数字。

  • )*关闭非捕获组并重复0+时间

Regex演示

代码语言:javascript
运行
复制
var pageNumberHypenComma = new RegExp("^\\d{1,3}(?:-\\d{1,3})?(?:,\\d{1,3}(?:-\\d{1,3})?)*$");
[
  "1,2,3,4-9-4",
  "1,2,3,4-9",
  "2,8",
  "1-3,5",
  "5-7",
  "7,8-6",
  "1-3,5",
  "1,2",
  "2,3,4,5-6,7",
  "10",
  "11-15",
  "22,25",
  "1,2,3,4-9,12"
  
].forEach(s => console.log(s + " ==> " + pageNumberHypenComma.test(s)))

要只匹配大于0的分页符,可以匹配一个数字1-9,后面跟着两个可选数字:

代码语言:javascript
运行
复制
^[1-9]\d{0,2}(?:-[1-9]\d{0,2})?(?:,[1-9]\d{0,2}(?:-[1-9]\d{0,2})?)*$

Regex演示

代码语言:javascript
运行
复制
var pageNumberHypenComma = new RegExp("^[1-9]\\d{0,2}(?:-[1-9]\\d{0,2})?(?:,[1-9]\\d{0,2}(?:-[1-9]\\d{0,2})?)*$");
[
  "1,2,3,4-9-4",
  "0",
  "0-1, 3",
  "1,2,3,4-9",
  "2,8",
  "1-3,5",
  "5-7",
  "7,8-6",
  "1-3,5",
  "1,2",
  "2,3,4,5-6,7",
  "10",
  "11-15",
  "22,25",
  "1,2,3,4-9,12",
  "0",
  "0-1,3"

].forEach(s => console.log(s + " ==> " + pageNumberHypenComma.test(s)))

使用范围为1-125而不是999的模式如下所示:

代码语言:javascript
运行
复制
^(?:[1-9]|[1-9]\d|1[01]\d|12[0-5])(?:-(?:[1-9]|[1-9]\d|1[01]\d|12[0-5]))?(?:,(?:[1-9]|[1-9]\d|1[01]\d|12[0-5])(?:-(?:[1-9]|[1-9]\d|1[01]\d|12[0-5]))?)*$

Regex演示

代码语言:javascript
运行
复制
var pageNumberHypenComma = new RegExp("^(?:[1-9]|[1-9]\\d|1[01]\\d|12[0-5])(?:-(?:[1-9]|[1-9]\\d|1[01]\\d|12[0-5]))?(?:,(?:[1-9]|[1-9]\\d|1[01]\\d|12[0-5])(?:-(?:[1-9]|[1-9]\\d|1[01]\\d|12[0-5]))?)*$");
[
  "1,2,3,4-9",
  "2,8",
  "1-3,5",
  "5-7",
  "7,8-6",
  "1-3,5",
  "1,2",
  "2,3,4,5-6,7",
  "10",
  "11-15",
  "22,25",
  "0",
  "0-1,3",
  "1,2,3,4-9",
  "1,2,3,4-9-4",
  "1",
  "126",
  "125",
  "10",
  "1000",
  "1,4,124-125,4",
  "1,4,125-126"
].forEach(s => console.log(s + " ==> " + pageNumberHypenComma.test(s)))

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57406811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档