修剪课程使用正则表达式计划数据

时间:2011-02-24 14:50:17

标签: mysql regex notepad++ trim

我需要您帮助使用正则表达式从以下类型的数据中提取时间信息:

TTh 7-8:30AM lec AIT PANEL D                                     
WF 1-2:30PM lec BA 104                                           
S 9:00a-12:00p lec CPA 306                                       
MTh 7:00a-8:30a lec AIT PANEL D                                  
TTh 2:30-4PM lec BA 104                                          
TTh 2:30-4PM lec BA 104                                          
TTh 4-5:30PM lec CPA 301                                         
S 9AM-12PM lec TBA                                               
Sa 09:00a-12:00p lec BA 301                                      
Sa 09:00a-12:00p lec BA 301                                      
MTh 08:30a-10:00a lec BA 301                                     
TTh 1-2:30PM lec CPA 301                                         
TTh 7-8:30AM lec AIT PANEL D   

正如您所看到的,这些是课程安排。这组值是更大数据集的一部分, 包含其他属性(由选项卡分隔)并存储在文本文件中。我想修剪 来自这些计划值的所有非时间相关信息,以便它们成为以下内容,

例如:

7-8:30AM                                 
1-2:30PM
9:00a-12:00p
7:00a-8:30a
2:30-4PM
2:30-4PM
4-5:30PM
9AM-12PM
09:00a-12:00p

好的,这就是我对日程安排价值的了解:

  1. 计划值中的标记由空格分隔。
  2. 时间标记包含数字,短划线,冒号,并且可以包含 字母AM,PM,a,p。
  3. 我有这种感觉,这对你们来说可能是一项轻松的任务, 不幸的是,我并不精通正则表达式。

    这就是为什么我非常需要你的帮助。 非常感谢你!

    PS: 我正在使用Notepad ++编辑文件, 如果我有办法使用Notepad ++可以做到这一点。 或者我也可以使用Update命令在MySQL中执行此操作吗?

    similar question

3 个答案:

答案 0 :(得分:0)

你可以在mySQL级别更容易做到这一点,而不是在Regex中这样做。我不熟悉mySQL,但我认为有一个等同于TSQL CharIndexSUBSTRING_INDEX

使用 TSQL 的一行快速而肮脏 - 绝不宣称效率高,但它可行,您应该适应迭代原始数据并转换为mySql语法:

declare @scheduleLine varchar(500);
Set @scheduleLine = 'TTh 7-8:30AM lec AIT PANEL D';
declare @firstSpace int, @secondSpace int;
Set @firstSpace = CHARINDEX(' ',@scheduleLine,0);
Set @secondSpace = CHARINDEX(' ',@scheduleLine, @firstSpace+1)
Declare @timeOfClass varchar(20)
Set @timeOfClass = SUBSTRING(@scheduleLine, @firstSpace, (@secondSpace-@firstSpace));
Select @timeOfClass as TimeOfClass

将导致:

 7-8:30AM

只需使用mySQL等效文件。

答案 1 :(得分:0)

有点晚了,但试试看:

搜索内容:.*?(\d+(?::\d+)?(?:[ap]m?)?-\d+(?::\d+)?(?:[ap]m?)?).*
替换为:$1

答案 2 :(得分:0)

我意识到我可以使用space作为分隔符来拆分字符串,并获取返回列表的第二个元素。