1

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");
                    %>
souv202112
  • 13
  • 4

2 Answers2

0

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

bobble bubble
  • 16,888
  • 3
  • 27
  • 46
  • is there any way to have not operation in regex i.e suppose if i want to match all the text except the ones this regex match . – souv202112 Dec 10 '21 at 12:43
  • @souv202112 You could try [something like this](https://regex101.com/r/CAdGmc/1) which captures the other stuff to group 1. – bobble bubble Dec 10 '21 at 12:48
0

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