从正则表达式模式中删除撇号

时间:2017-08-18 17:19:12

标签: regex oracle

我对正则表达式有点新意,写了一个简单的正则表达式来检索单词" Preview"来自下面的字符串。

  

时间:' 333333333333333333316:06:55 -232323'许可:'预览'教师姓名:' 4444444444444ffffffffffff'学生:' cccccccccccssssssssss'考试成绩:' eeeeeeeeeeeA'

这是我在下面的正则表达式

Permission:\s?'([a-zA-z]+)'\s?Teacher name

我想重新创建我的正则表达式,不要在其中包含撇号。

我打算在oracle查询中的REGEX_SUBSTR表达式中使用这个正则表达式,似乎不能很好地使用我的正则表达式撇号。

我该怎么做?

我知道正则表达式有很多格式,所以如果有人知道更好的模式,请随时提出建议。

1 个答案:

答案 0 :(得分:1)

您可以通过转义单引号来使用您当前的正则表达式模式(根据Wiktor的评论进行更正!):

regexp_substr(<your string>, 'Permission:\s?''([a-zA-Z]+)''\s?Teacher name')

或更清楚地使用the alternative quoting mechanism

regexp_substr(<your string>, q'[Permission:\s?'([a-zA-Z]+)'\s?Teacher name]')

它允许你保留原来的单引号,并将整个内容放在一组分隔的单引号中,使用未出现在实际内容中的分隔符 - 我在这里使用了方括号,所以q'[ ... ]'。这允许内部的任何内容,...部分,包括未转义的单引号。

演示:

with t (str) as (
  select q'[Time: '333333333333333333316:06:55 -232323' Permission: 'Preview' Teacher name: '4444444444444ffffffffffff' Student: 'cccccccccccssssssssss' Exam score: 'eeeeeeeeeeeA']' from dual
)
select regexp_substr(str, 'Permission:\s?''([a-zA-Z]+)''\s?Teacher name')
from t;

REGEXP_SUBSTR(STR,'PERMISSION:\S?'
----------------------------------
Permission: 'Preview' Teacher name

或:

with t (str) as (
  select q'[Time: '333333333333333333316:06:55 -232323' Permission: 'Preview' Teacher name: '4444444444444ffffffffffff' Student: 'cccccccccccssssssssss' Exam score: 'eeeeeeeeeeeA']' from dual
)
select regexp_substr(str, q'[Permission:\s?'([a-zA-Z]+)'\s?Teacher name]')
from t;

REGEXP_SUBSTR(STR,Q'[PERMISSION:\S
----------------------------------
Permission: 'Preview' Teacher name

要获得“预览”一词,您可以使用regexp_replace()并使用反向引用:

with t (str) as (
  select q'[Time: '333333333333333333316:06:55 -232323' Permission: 'Preview' Teacher name: '4444444444444ffffffffffff' Student: 'cccccccccccssssssssss' Exam score: 'eeeeeeeeeeeA']' from dual
)
select regexp_replace(str,
  '(.*Permission:\s?'')([a-zA-Z]+)(''\s?Teacher name.*)', '\2', 1, 1)
from t;

REGEXP_
-------
Preview

with t (str) as (
  select q'[Time: '333333333333333333316:06:55 -232323' Permission: 'Preview' Teacher name: '4444444444444ffffffffffff' Student: 'cccccccccccssssssssss' Exam score: 'eeeeeeeeeeeA']' from dual
)
select regexp_replace(str,
  q'[(.*Permission:\s?')([a-zA-Z]+)('\s?Teacher name.*)]', '\2', 1, 1)
from t;

REGEXP_
-------
Preview