kcvenkat123 has asked for the wisdom of the Perl Monks concerning the following question:

Scenario 1 my $comment="<Comment>These are the wild characters value @#$%^&*<\Com +ment>"; if ($comment !~ /\<Comment\>*[^|<|^>|^\/]*\<\/Comment\>/) { print "Passed the test as there were no > < / in the comment \n"; } Scenario 2 my $comment="<Comment>These are the wild characters value @#$%^&* > +< / <\Comment>"; if ($comment !~ /\<Comment\>*[^|<|^>|^\/]*\<\/Comment\>/) { print "Passed the test as there were no > < / in the comment \n"; } else { print "Failed the test as there were > < / characters in the commen +t \n"; } User will input the following as a comment. And the regular expression should negate any < > / character entered a +s sentence in the USERSTORY . <Comment>USERSTORY<\Comment>

Hi

I need to negate XML tags(< > and /) in a sentence(basically a comment entered)

which is entered in between xml tags .

Here is what i am doing .Please let me know if the regular expression that i have is doing the right thing.

I am having two scenarios where the first one should pass and second one should fail

User will input the following as a comment.

And the regular expression should negate any < > / character entered as sentence in the USERSTORY .

<Comment>USERSTORY<\Comment>

Replies are listed 'Best First'.
Re: REGEX negate XML tags
by Your Mother (Archbishop) on Nov 20, 2009 at 20:58 UTC

    This might be what you're after to escape (not negate) the characters-

    perl -MHTML::Entities -le 'print encode_entities(shift)' '"><' &quot;&gt;&lt;

    HTML::Entities is tunable so you can set it to only escape exactly what you want.

Re: REGEX negate XML tags
by ikegami (Patriarch) on Nov 20, 2009 at 20:58 UTC
    A positive match would be:
    [<>/] # char that is "<", ">" or "/"

    Add ^ for a negative match:

    [^<>/] # char that isn't "<", ">" or "/"

    In addition to your pattern being bad, your tests strings are bad (<\Comment>).

    use Test::More tests => 2; $comment = '<Comment>foo bar</Comment>'; ok( $comment =~ m{<Comment>[^<>/]*</Comment>}, 'Detect no specials'); $comment = '<Comment>foo < bar</Comment>'; ok( $comment !~ m{<Comment>[^<>/]*</Comment>}, 'Detect <');
    $ perl -MTest::Harness -e'runtests @ARGV' 808525.t 808525.t .. ok All tests successful. Files=1, Tests=2, 0 wallclock secs Result: PASS
      Thank you very much for the reply and correcting the error. It worked.