Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8396463
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 9, 20262026-06-09T20:32:32+00:00 2026-06-09T20:32:32+00:00

Given the code below, I want to match the first form occurrence. I found

  • 0

Given the code below, I want to match the first form occurrence. I found out that negative lookahead ?! may be used to achieve that but it doesn’t work. What’s wrong with my regex?

#test
$test = "<form abc> foo </form> <form gg> bar </form>";
$test =~ m/<form[^>]*abc[^>]*>(?!.*form>.*)form>/s;
print $&;
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-09T20:32:34+00:00Added an answer on June 9, 2026 at 8:32 pm

    First, before explaining the regex: Use a module like HTML::TreeBuilder to create a document tree, then fetch your information from there. Parsing HTML with regexes is too error prone to use in the real world.

    The Problem with your regex

    Here is your string:

    "<form abc> foo </form> <form gg> bar </form>"
    

    And your regex (written expanded for readability, as with the /x flag):

    <form [^>]* abc [^>]* > (?! .* form> .* ) form>
    
    • <form anchores when the literal character sequence is found

    • [^>]* searches for a number of non-> characters. Initially it matches  abc

    • abc matches the literal character sequence abc. But because the regexp engine currently sees a > it has to backtrack, until [^>]* matches  .

    • [^>]* will match nothing, as the engine sees a >

    • > matches the >

    • The negative lookahead matches, when the expression .* form .* would not match.

      • The .* would consume all characters until end of string.

      • form> causes the engine to backtrack until the .* matches foo </form> <form gg> bar </.

      • The .* matches nothing, but that is okay.

    So the lookahead succeeds, but it is a negative lookahead, so the assertion failes. The last part of the Regex will not even be executed.

    Strategies

    The .* consumes too many chararacters in our case. This is called greedy matching.

    Non-greedy matching is written with a trailing ? like .*?. This version consumes zero characters initially and first checks the next part of the pattern. If that doesn’t work, it consumes another character iteratively until there is a match.

    A better Regex

    <form [^>]* > .*? </form>
    

    Inside the opening tag, only non-> characters are allowed. Between the tags, any character is allowed. We do non-greedy matching, so the first end tag matches and ends the regex.

    However, this solution is a bit problematic. A tolerant HTML parser would not choke on a attr="val<u>e". We will. Also, the first </form> is matched, which is undesirable in the event that we have nested forms. While unproblematic in this use case, this regex is totally useless when matching <div>s or the like.

    Regexp Grammars

    Perl regexes are incredibly powerful and allow you to declare recursive grammars. The built-in syntax is a bit akward, but I recommend the Regexp::Grammars module to do that easily. Better yet, simply use a fully-fledged HTML Parser already lying around.

    Fetching the match

    The use of $& (and $` and $') is discouraged, as it makes perl incredibly inefficient. This won’t manifest itself in a small script, but its bad style anyway. Rather enclose your whole Regexp with parens to capture the match

    m{ ( <form [^>]* > .*? </form> ) }
    

    and then use $1.

    The perlretut Tutorial may be a good introduction to understand Perl regexes.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Given my code below, is there a way that the first WebTestingApp constructor can
Given the code below, how would you create/implement SR.h so that it produces the
Given the following code below, how can I have it modified such that it
I had written the code given below: Its output datatype is integers, I want
Given the code below ... Net::HTTP.start('localhost', 4000) do |http| # # usual stuff omitted
Given the code below, how do I compare a List of objects's values with
I was given the code below to disable a button on an ASP.Net page
Any ideas given the code below why the highlight is being triggered to run
Given the Java code below, what's the closest you could represent these two static
for the Given below code after int Input Value of 46348 i am getting

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.