用于选择特定内容的正则表达式,前提是它未包含在注释中

Uma*_*dar 11 regex sql oracle

我正在寻找一个匹配模式src ="*.js"的正则表达式,但这不应该包含在注释中.

考虑以下

<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
<!----<script type="text/javascript" src="js/Shop.js"></script>  -->
<script type="text/javascript" src="jquery.serialize-object.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>
Run Code Online (Sandbox Code Playgroud)

扩展的样本输入,由OP描述为"正确":

<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
<!----<script type="text/javascript" src="js/Shop.js"></script>  -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
-- afterwards -->
<script type="text/javascript" src="jquery.serialize-object.js"></script>
<script type="text/javascript" src="jquery.cookie.js"></script>
Run Code Online (Sandbox Code Playgroud)

结果不应与第1行和第2行匹配(其中内容用注释括起来).它应该只匹配第3行和第4行(3端,除了注释结束行,用于扩展的样本输入).

到目前为止,我有这个正则表达式,它选择我所有的.js文件,但也选择了注释掉的文件: (src=\")+(\S)+(.js)

我正在寻找一个正则表达式,它只选择带有.js src属性但没有注释包围的脚本标签.

我还想提一下,我在Oracle PL SQL查询中使用这个正则表达式.

Dav*_*ber 3

我不知道您是否可以使用单个正则表达式执行您想要的操作,特别是因为 Oracle 的正则表达式实现不支持环视。但是您可以使用 SQL 执行一些操作来绕过这些限制。src=".*\.js"下面将提取模式的匹配项,首先从文本中删除注释,然后在剩余内容中匹配模式。使用以下方法检索多个结果CONNECT BY

SELECT html_id, REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') AS match
  FROM (
    SELECT html_id, REGEXP_REPLACE(html_text, '<!--.*?-->', '', 1, 0, 'n') AS clean_html
      FROM (
        SELECT 1 AS html_id, '<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
        <!----<script type="text/javascript" src="js/Shop.js"></script>  -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
        -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script>
        <script type="text/javascript" src="jquery.cookie.js"></script>' AS html_text
          FROM dual
    )
)
CONNECT BY REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') IS NOT NULL
   AND PRIOR html_id = html_id
   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

如果这些结果存储在某个表中,那么您将执行以下操作:

SELECT html_id, REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') AS match
  FROM (
    SELECT html_id, REGEXP_REPLACE(html_text, '<!--.*?-->', '', 1, 0, 'n') AS clean_html
      FROM mytable
)
CONNECT BY REGEXP_SUBSTR(clean_html, 'src=".*\.js"', 1, LEVEL, 'i') IS NOT NULL
   AND PRIOR html_id = html_id
   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,但最后两行是必要的,以避免重复的结果。

结果如下:

| HTML_ID | MATCH                              |
+---------+------------------------------------+
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.serialize-object.js"   |
|       1 | src="jquery.cookie.js"             |
+---------+------------------------------------+
Run Code Online (Sandbox Code Playgroud)

SQL 小提琴在这里。

希望这可以帮助。

编辑:根据我的评论进行编辑如下:

SELECT html_id, REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i') AS match
  FROM (
    SELECT html_id, REGEXP_REPLACE(html_text, '<!--.*?-->', '', 1, 0, 'n') AS clean_html
      FROM (
        SELECT 1 AS html_id, '<!------<script type="text/javascript" src="js/Shop.js"></script>  -->
        <!----<script type="text/javascript" src="js/Shop.js"></script>  -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!---->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script><!-- a comment starting but not ending
        -- afterwards -->
        <script type="text/javascript" src="jquery.serialize-object.js"></script>
        <script type="text/javascript" src="jquery.cookie.js"></script>' AS html_text
          FROM dual
    )
)
CONNECT BY REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i') IS NOT NULL
   AND PRIOR html_id = html_id
   AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

编辑

如果您搜索的是列CLOB而不是CHAR列,则子句的第一行CONNECT BY应如下所示。如果相关列是 a ,则REGEXP_SUBSTR()返回 a ,并且在这种情况下比较将永远持续:CLOBCLOB

CONNECT BY DBMS_LOB.SUBSTR(REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i'), 4000, 1) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。