Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re: Regex in json: escaping forward slash

by Mr. Muskrat (Abbot)
on Aug 22, 2012 at 21:23 UTC ( #989151=note: print w/ replies, xml ) Need Help??


in reply to Regex in json: escaping forward slash

How about you show us the code you're using to read that JSON? Then we can tell you how to make it work properly.


Comment on Re: Regex in json: escaping forward slash
Re^2: Regex in json: escaping forward slash
by mhearse (Hermit) on Aug 22, 2012 at 21:25 UTC
    #!/usr/bin/env perl use strict; use JSON; use Data::Dumper; my $contents = `cat progconfig.json`; my $config = JSON->new->decode($contents); print Dumper($config);

      That code doesn't exhibit the problem you are trying to solve. (It isn't trying to do anything that requires escaping the slashes.)

      Output:

      $VAR1 = { 'regex' => { '.*/home/members/index.htm.*' => { '404' => { ' +reporting' => '1000', ' +paging' => '2000' } } } };

      Even when I use that key as a regex, it works for me.

      #!/usr/bin/env perl use strict; use warnings; use JSON; use Data::Dumper; my $contents = `cat progconfig.json`; my $config = JSON->new->decode($contents); my $re = (keys %{$config->{regex}})[0]; print "re: $re\n"; my $path = '/some/fake/path/home/members/index.html'; if ( $path =~ /$re/ ) { print "$path matched regex\n"; }

      Output:

      re: .*/home/members/index.htm.* /some/fake/path/home/members/index.html matched regex

      But what's the problem? Maybe you could provide an example of how your code is failing to deal with '/' properly. In the following example I decode your sample JSON, grab the key that looks like a regular expression, compile it as a regular expression, and use it to perform a match.

      use strict; use warnings; use JSON; use constant KEY => 0; use constant VALUE => 1; my $json_string = <<'END_JSON'; { "regex" : { ".*/home/members/index.htm.*" : { "404" : { "reporting" : "1000", "paging" : "2000" } } } } END_JSON my @test_strings = qw( web/home/members/index.htm?garbage=bye /home/memberzzzz/index.htm?garbage=bye ); my $decoded_json = JSON->new->decode( $json_string ); # The regex is contained within a hash key. my $regex_string = (%{$decoded_json->{regex}})[KEY]; my $regex = qr/$regex_string/; foreach my $test_string ( @test_strings ) { if( $test_string =~ m/$regex/ ) { print "Bingo! [$test_string] matches the pattern '$regex_string'\n +"; } else { print "Boo! [$test_string] doesn't match the pattern '$regex_strin +g'\n"; } }

      No special escaping of '/' here. The qr// operator is convenient.


      Dave

        Thanks for your reply. I made a poor assumption. I was under the impression that:
        my $regex = ".*/home/members/index.htm.*"; if (/$regex/)
        Was the same as
        if (/.*/home/members/index.htm.*/)
        Which would fail. I was wrong!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://989151]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (9)
As of 2015-07-07 11:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (88 votes), past polls