首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >匹配时间范围,包括上午7时至晚上10时。

匹配时间范围,包括上午7时至晚上10时。
EN

Stack Overflow用户
提问于 2015-04-14 11:29:27
回答 2查看 1.5K关注 0票数 2

我编写了以下正则表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)

要匹配以下类型的时间格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
7am-10pm (matches correctly and creates 4 match groups 7, am, 10, pm)

13am-10pm (this should not be matched, however it matches and creates 4 match groups 3, am, 10, pm)

10pm (this doesn't match as expected because it doesn't specify the time range end)

111am-10pm (this should not be matched, however it matches and creates 4 match groups 11, am, 10, pm)

我如何改进我的正则表达式,使我不需要重复数字和am/pm模式,并且还可以这样做:

  1. 它只捕捉时间范围的组成部分,如上午7点-10点,应该只有2组比赛上午7点,10点。
  2. 它只匹配适当的时间,如上午111分或下午13时等,应视为不匹配。
  3. 我不知道是否可以用正则表达式,但是我们能不能使正则表达式匹配正确的时间范围,例如早上7点到下午1点应该匹配,但是下午4点到下午1点应该不匹配吗?

注意:我正在使用Ruby2.2.1

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-14 12:02:24

首先让我们看看你做错了什么:

13 am -10 pm(这不应该匹配,但它匹配,并创建4个匹配组3,上午,10,下午)

它只匹配适当的时间,如上午111分或下午13时等,应视为不匹配。

这是匹配的,因为您允许在这里匹配单个数字1-9:(1012\1-9)。

为了解决这个问题,你要么允许一个1-9位数字,要么允许1+ 0-2.因为我们不知道正则表达式何时开始,所以我们将使用一些单词边界来确保我们有一个“单词开始”。

由于您不想捕获数字,但是在整个时间加上am\pm,您可以使用一个非捕获组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\b((?:1[0-2]|[1-9])

然后,简单地重复我们自己,加上一个破折号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\b((?:1[0-2]|[1-9])[ap]m)-((?:1[0-2]|[1-9])[ap]m)

关于第3点,是的,你可以用正则表达式来做这件事,但是只要你得到第1组和第2组,看看时间范围是否真的有意义,你就会更好地加入一个逻辑检查。

所有这些都是你得到的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# \b((?:1[0-2]|[1-9])[ap]m)-((?:1[0-2]|[1-9])[ap]m)
# 
# 
# Assert position at a word boundary «\b»
# Match the regular expression below and capture its match into backreference number 1 «((?:1[0-2]|[1-9])[ap]m)»
#    Match the regular expression below «(?:1[0-2]|[1-9])»
#       Match either the regular expression below (attempting the next alternative only if this one fails) «1[0-2]»
#          Match the character “1” literally «1»
#          Match a single character in the range between “0” and “2” «[0-2]»
#       Or match regular expression number 2 below (the entire group fails if this one fails to match) «[1-9]»
#          Match a single character in the range between “1” and “9” «[1-9]»
#    Match a single character present in the list “ap” «[ap]»
#    Match the character “m” literally «m»
# Match the character “-” literally «-»
# Match the regular expression below and capture its match into backreference number 2 «((?:1[0-2]|[1-9])[ap]m)»
#    Match the regular expression below «(?:1[0-2]|[1-9])»
#       Match either the regular expression below (attempting the next alternative only if this one fails) «1[0-2]»
#          Match the character “1” literally «1»
#          Match a single character in the range between “0” and “2” «[0-2]»
#       Or match regular expression number 2 below (the entire group fails if this one fails to match) «[1-9]»
#          Match a single character in the range between “1” and “9” «[1-9]»
#    Match a single character present in the list “ap” «[ap]»
#    Match the character “m” literally «m»
票数 1
EN

Stack Overflow用户

发布于 2015-04-14 11:46:44

您在正则表达式中缺少了^ (行的开始),这就是为什么它是从中间匹配的。

你必须使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
^(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)

更好的解决方案:如果模式不总是从新行开始,也可以使用\b (边界)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
\b(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)\b

演示

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

https://stackoverflow.com/questions/29635841

复制
相关文章
C# 字节数组截取
C# 字节数组截取 如: byte[] bt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 方法一 截取位数规则 1)截取2位长度的字节数组 用BitConverter.ToInt16 例如,从第2位开始截取2个字节则 BitConverter.ToInt16(bt,2);
全栈程序员站长
2022/08/12
3.5K0
[C#]结构体和字节数组的相互转化
public static class StructCopyer { // 相当于序列化与反序列化,但是不用借助外部文件 //1、struct转换为Byte[] public static Byte[] StructToBytes(Object structure) { Int32 size = Marshal.SizeOf(structure); IntPtr buffe
静默虚空
2022/05/07
8030
C#中的多维数组和交错数组
C#中有多维数组和交错数组,两者有什么区别呢! 直白些,多维数组每一行都是固定的,交错数组的每一行可以有不同的大小。 以二维的举例,二维数组就是m×n的矩阵,m行n列;而交错数组(又叫锯齿数组
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.9K0
C#中的多维数组和交错数组
C#数组
这样就声明了一个数组(声明数组,而非定义)。接着就该给声明好的数组分配内存了,由于C#里数组是引用类型,因此应当使用new运算符来分配内存,这个时候应当指出数组含有的元素个数。
zy010101
2019/05/25
6810
封装数组之包含、搜索和删除元素
前言:在上一小节中我们已经会了如何获取和如何修改数组中的元素,在本小节中我们将继续学习如何判断某个元素是否在数组中存在、查询出某个元素在数组中的位置、以及删除数组中元素等方法的编写。
wfaceboss
2019/04/08
7890
C++结构体数组 | 结构体数组的使用
C++结构体数组与以前介绍过的数值型数组的不同之处在于:每个数组元素都是一个结构体类 型的数据,它们都分别包括各个成员项。
小林C语言
2020/12/30
4.6K0
C++结构体数组 | 结构体数组的使用
连续存储数组的算法(包含数组倒置、冒泡排序……)
线性结构【把所有的结点用一根直线穿起来】   连续存储【数组】、离散存储【链表】(不连续的,可分隔开来) 4 #include<stdio.h> 5 #include<malloc.h>//包含malloc函数 6 #include<stdlib.h>//包含exit函数 7 //定义了一个(复合)数据类型,名字叫struct Arr,该数据类型有三个成员: 8 struct Arr{ 9 int * pBase; //存储的是数组第一个元素的地址 10 int l
孙晨c
2019/09/10
8200
java字符串的字节数组_Java字节数组到字符串到字节数组
我正在尝试将byte []转换为字符串,将byte []的字符串表示形式转换为byte []的转换...我将byte []转换为要发送的字符串,然后我期望我的Web服务(用python编写)将数据直接回显给客户端。
用户7886150
2021/04/29
5.2K0
数据结构:数组和链表的区别(数组和链表的优缺点 & 数组和链表的适用场景)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147966.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
2.6K0
js 实现扁平数组转为树形结构数组及树形结构数组转为扁平数组
转载请注明出处:https://www.cnblogs.com/beileixinqing/p/16666662.html
蓓蕾心晴
2022/09/24
1.9K0
数组(ArrayPool数组池、Span<T>结构)
  如果需要使用相同的类型的多个对象,就可以使用集合和数组,这一节主要讲解数组,其中会重点涉及到Span<T>结构和ArrayPool数组池。我们也会先涉及到简单的数组、多维数组、锯齿数组、Array类。
小世界的野孩子
2019/07/30
1.5K0
数组(ArrayPool数组池、Span<T>结构)
js判断数组中是否包含某个指定元素的个数_js 数组包含某个元素
indexOf()完整语法: array.indexOf(item,start)
全栈程序员站长
2022/11/02
11.3K0
invoke和begininvoke 区别——c#
      https://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html
vv彭
2020/12/16
2.7K0
invoke和begininvoke 区别——c#
8.2 结构体数组和指针
指向结构体对象的指针变量既可以指向结构体变量,也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同
小林C语言
2019/08/09
9330
其他流---字节流数组
字节流数组读入 建立字节流读取,参数为字节数组读入流 InputStream bi = new BufferedInputStream(new ByteArrayInputStream(c)); 建立读取字节数组,数组长度变量len int len = 0; byte[] flush = new byte[1024]; 读取到需要操作的变量 String s = ""; while (-1 != (len = bi.read(flush))) { s += new String(flush,
shimeath
2020/07/30
6450
c#数组赋初值_C#数组初始化
C#的数组初始化是在声明数组时将初始值放在大括号({})之内。如果没有指定初始值,则数组成员将自动初始化为该数组类型的默认初始值。请阅读数组的属性。如果将数组声明为某类型的字段,则当实例化该类型时它将被设置为默认值null。
全栈程序员站长
2022/09/09
1.6K0
C# 数组(Array)
初始化数组: 声明一个数组不会在内存中初始化数组。当初始化数组变量时,您可以赋值给数组。 数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。 例如:
acc8226
2022/05/17
1.1K0
C# 数组基础
一、数组的基础知识 1、数组有什么用? 如果需要同一个类型的多个对象,就可以使用数组。数组是一种数组结构,它可以包含同一个类型的多个元素. 2、数组的初始化方式 第一种:先声明后赋值 int[] ar
郑小超.
2018/01/26
1.2K0
C#中数组、ArrayList和List的区别
在C#中,数组、ArrayList、List都能够存储一组对象,那么他们的区别是什么呢?
Karl Du
2023/10/20
3070
C#字符串、字节数组和内存流间的相互转换
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] bt=Convert.FromBase64String("字符串"); 补充: System.Text.Encoding.Unicode.GetBytes(str); System.Text.Encoding.UTF8.GetBytes(str); System.Text.Encod
跟着阿笨一起玩NET
2018/09/20
2K0

相似问题

C# P/Invoke封送变长结构数组

19

C#如何在结构中使用结构数组进行P/Invoke?

15

C# P/Invoke:包含函数指针的编组结构

32

C# P/Invoke结构问题

42

C# P/invoke结构对齐

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文