I am trying to match the content between <%.....%> in a JSP code. Suppose the sample JSP code is :
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>Auto Refresh</title>
</head>
<body>
<fieldset style="width:20%; background-color:#e6ffe6;">
<legend>Auto refresh</legend>
<h2>Auto Refresh Example</h2>
<%
// Set refresh, autoload time as 1 seconds
response.setIntHeader("Refresh", 1);
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour ":" minute ":" second " " am_pm;
out.println("Crrent Time: " CT "\n");
%>
</fieldset>
</body>
</html>
My regex is /\<\%[\w \@\=\.\*\,\"\$\#\!\&\(\)\/\/\n\ \;\:]*\%\>/gi
Its only matching the first part i.e
<%@ page import="java.io.*,java.util.*" %>
Not the second part
<%
// Set refresh, autoload time as 1 seconds
response.setIntHeader("Refresh", 1);
........
String CT = hour ":" minute ":" second " " am_pm;
out.println("Crrent Time: " CT "\n");
%>
CodePudding user response:
If you drop %>
for trial you can see how far it matches. Until the backslash at \n"
because it's not included in your specified characterset. Add the backslash or use something more general like
/<%[\s\S]*?%>/g
which will lazily match any amount of any character in between <%
and %>
.
CodePudding user response:
Try this regex. It's short and simple.
/<%.*?%>/gs
Explanation
.*?
matches any character from zero to unlimited times, as few times as possible (lazy).
So, it takes everything between <%
and closest %>
. Pay attention to single line modifier /s