Home > Net >  Regex pattern to match the java part in JSP code
Regex pattern to match the java part in JSP code

Time:12-10

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 %>.

See this demo at regex101

CodePudding user response:

Try this regex. It's short and simple.

/<%.*?%>/gs

Demo

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

  • Related