通过正则表达式

时间:2017-02-20 15:33:18

标签: regex string plsql

大学的课程名称通常分为两个不同的部分,即“部门”和“课程编号”

例如,

ENGLISH 101。

我的目标是编写一个与模式匹配的正则表达式,这些组允许我指定我是在查看上半部分还是第二部分。

问题在于,并非所有大学都使用相同的格式来处理这些事情。以下是我在其他大学遇到的“奇怪的东西”的3个测试案例。

1250-101
ENGLISH101
ENG|101-L

我写了2个正则表达式,一个处理所有奇怪的数字和奇数字符,另一个处理从字母到数字的变化。但我无法找到一种方法让他们彼此很好地相处。我在下面复制了它们。

SELECT REGEXP_SUBSTR('ENGLISH101','(^\D*)(\d*)',1,1,NULL,1) FROM DUAL;
ENGLISH
SELECT REGEXP_SUBSTR('ENGLISH101','(^\D*)(\d*)',1,1,NULL,2) FROM DUAL;
101
SELECT REGEXP_SUBSTR('ENG|101-L','^(\w*)[\|/, \\-](.*)',1,1,NULL,1) FROM DUAL;
ENG
SELECT REGEXP_SUBSTR('ENG|101-L','^(\w*)[\|/, \\-](.*)',1,1,NULL,2) FROM DUAL;
101-L

这很好。但我不知道如何组合给我一个正则表达式,允许我得到英语(或其他任何东西)或101取决于分组。或者也许分组是导致这种头痛开始的原因?

或者,正则表达式一直都是错误的方法,我应该编写一个函数来逐个字符地迭代字符串并自己拆分它们吗?这似乎效率低下,但在这一点上我想我应该问这个问题。

对此有任何建议或见解将不胜感激。

1 个答案:

答案 0 :(得分:0)

下面的查询应选择与您描述的三个边缘案例相对应的所有记录,并将前半部分与课程名称的后半部分分开。

SELECT SUBSTR(col, 1, INSTR(col, '-') - 1) AS first_half,
       SUBSTR(col, INSTR(col, '-') + 1)    AS second_half
FROM yourTable
WHERE col LIKE '%-%' AND col NOT LIKE '%|%'
UNION ALL
SELECT SUBSTR(col, 1, INSTR(col, '|') - 1),
       SUBSTR(col, INSTR(col, '|') + 1)
FROM yourTable
WHERE col LIKE '%|%'
UNION ALL
SELECT REGEXP_REPLACE(col, '[0-9]', ''),
       REGEXP_REPLACE(col, '[A-Za-z]', '')
FROM yourTable
WHERE col NOT LIKE '%-%' AND col NOT LIKE '%|%'

<强>解释

UNION中的第一个查询定位那些有破折号但不是管道的课程名称。在这种情况下,我们可以根据破折号干净地拆分名称。第二个查询使用管道(也可以有破折号)来定位名称。在这种情况下,我们想要拆分管道。最后,第三个查询是剩下的情况,它是紧接在前的字母课程名称,没有空格,课程编号。为此,我使用REGEXP_REPLACE()删除数字或字母字符,让我们留下第一和第二部分。

注意:如果您将边缘情况与正常数据一起使用,则可能需要稍微调整WHERE条件。例如,要定位第三个边缘大小写ENGLISH101,您可能会检查它没有任何管道或破折号,它没有空格,它有数字和字母。< / p>