1

我创建了一个正则表达式来捕获我需要的字符串。当我在rubular.com等网站上测试正则表达式时,一切正常,但是当我将相同的正则表达式投入REGEXP_SUBSTR使用时,它就不起作用了。

下面是 2 个 SQL 示例(一个是英文文本,另一个是 Kristaps Porzingis 的语言):

SELECT regexp_substr('<ul data-error-code="REOPENED" data-unique-error-code="REOPENED"><li class="b">This is the text I would like to substr! <p class="tutorial" href="#">Other random text that I do not need</li></ul>'
                    ,'<li class="b">([\wāēīšžģņļčķū:!,\b\s]+)<') 
  FROM dual;

SELECT regexp_substr('<ul data-error-code="REOPENED" data-unique-error-code="REOPENED"><li class="b">Šī ir valoda, ko lielākā daļa no jums nesaprot! <p class="tutorial" href="#">Other random text that I do not need</li></ul>'
                    ,'<li class="b">([\wāēīšžģņļčķū:!,\b\s]+)<') 
  FROM dual;

我正在尝试<li class="b">在下一个 html 标记之间选择文本,在本例中为<p class="tutorial">.

关于我做错了什么的任何建议?

4

3 回答 3

2

您可以简化该正则表达式。
与其寻找特定的字符,不如寻找不是<>

例如:

SELECT regexp_substr('<ul><li class="b">Šī ir valoda, ko lielākā daļa no jums nesaprot! <p>Not needed</li></ul>'
                    ,'<li class="b">([^<>]+)',1,1,'i',1) as b_class
FROM dual

where[^<>]匹配任何不是<或的字符>

或者你可以懒惰地匹配字符直到第一个<

SELECT regexp_substr('<ul><li class="b">Šī ir valoda, ko lielākā daļa no jums nesaprot! <p>Not needed</li></ul>'
                    ,'<li class="b">(.*?)<',1,1,'ni',1) as b_class
FROM dual

.*?尝试使用字符直到第一个<
并且通过添加匹配参数 n,如果标签后有多行文本,它也会匹配。

'n' 允许句点 (.)(即匹配任意字符字符)匹配换行符。如果省略此参数,则句点与换行符不匹配。

于 2017-06-15T07:39:45.153 回答
2

不建议使用正则表达式解析 HTML,您最好获取字符串并使用能够方便地解析 HTML 的语言对其进行解析。

如果您手头只有 Oracle DBMS,对于一次性工作,您可以考虑使用以下内容regexp_substr

SELECT regexp_substr('<ul><li class="b">Šī ir valoda, ko lielākā daļa no jums nesaprot! <p>Not needed</li></ul>',
      '<li\s+class="b">([^<]+)', 1, 1, NULL, 1) as RESULT from dual

请参阅REXTESTER 演示

在此处输入图像描述

这里,

  • <li\s+class="b">- 匹配<li,1+ 个空格,class="b">文字子串
  • ([^<]+)-将一个或多个字符捕获到 Group #1 中,而不是<

最后一个1参数允许您访问此组 1 的内容。

于 2017-06-15T08:26:00.383 回答
0

我会使用 Instr 搜索第一个 html 标记的位置,并在该位置之后执行一个子字符串来获取文本的尾部。下一步是在这条尾巴上搜索 '<' 并再次使用子字符串。

就像是

select substring(mytext, 1, instr(mytext, '<')) from 
(
 select substring(text, instr(text, '<li class="b">') + 
 length('<li class="b">') +1) as mytext from table
)
于 2017-06-22T14:59:51.513 回答