我正在寻找与模式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>
扩展的样本输入,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>
结果应与第1行和第2行(内容包含在注释中)不匹配。它只能与第3行和第4行匹配(3端,注释端行除外,用于扩展样本输入)。
到目前为止,我有这个正则表达式,它可以选择我所有的.js文件,也可以选择那些被注释掉的文件: (src=\")+(\S)+(.js)
(src=\")+(\S)+(.js)
我正在寻找一个仅选择带有.js src属性且未包含注释的脚本标签的正则表达式。
我还要提及的是,我在Oracle PL SQL查询中使用了此正则表达式。
我不知道您是否可以用单个正则表达式来完成您想做的事情,特别是因为Oracle的正则表达式实现不支持环顾四周。但是您可以使用SQL做一些事情来克服这些限制。下面将通过从文本中删除注释,然后通过匹配src=".*\.js"剩余内容中的模式来提取模式的匹配项。使用CONNECT BY以下方法检索多个结果:
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;
如果这些结果存储在某个地方的表中,那么您将执行以下操作:
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;
看起来很奇怪,但最后两行对于避免重复结果是必需的。
结果如下:
| 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" | +---------+------------------------------------+
SQL Fiddle在这里。
希望这可以帮助。
编辑: 根据下面我的评论进行了编辑:
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;
已编辑
如果要搜索CLOB而不是CHAR列,则CONNECT BY子句的第一行应如下所示。如果相关列是,REGEXP_SUBSTR()则将返回,并且在这种情况下,比较将永远花费:CLOB``CLOB
CLOB
CHAR
REGEXP_SUBSTR()
CLOB``CLOB
CONNECT BY DBMS_LOB.SUBSTR(REGEXP_SUBSTR(clean_html, 'src="[^"]*\.js"', 1, LEVEL, 'i'), 4000, 1) IS NOT NULL