我正在寻找一个匹配模式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查询中使用这个正则表达式.
我不知道您是否可以使用单个正则表达式执行您想要的操作,特别是因为 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)
希望这可以帮助。
编辑:根据我的评论进行编辑如下:
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)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |