Regular expressions

Revision as of 20:43, 25 January 2007 by Ce (talk | contribs) (→‎[[C plus plus|C++]]: linked boost; now logged in ...)

The goal of this task is

  • to match a string against a regular expression
  • to substitute part of a string using a regular expression
Task
Regular expressions
You are encouraged to solve this task according to the task description, using any language you may know.

AppleScript

Libraries: Satimage.osax

try
    find text ".*string$" in "I am a string" with regexp
on error message
    return message
end try
try
    change "original" into "modified" in "I am the original string" with regexp
on error message
    return message
end try

C++

  • Compiler: g++ 4.0.2
  • Libraries: boost
 #include <iostream>
 #include <string>
 #include <iterator>
 #include <boost/regex.hpp>
 
 int main()
 {
   boost::regex re(".* string$");
   std::string s = "Hi, I am a string";
 
   // match the complete string
   if (boost::regex_match(s, re))
     std::cout << "The string matches.\n";
   else
     std::cout << "Oops - not found?\n";
 
   // match a substring
   boost::regex re2(" a.*a");
   boost::smatch match;
   if (boost::regex_search(s, match, re2))
   {
     std::cout << "Matched " << match.length()
               << " characters starting at " << match.position() << ".\n";
     std::cout << "Matched character sequence: \""
               << match.str() << "\"\n";
   }
   else
   {
     std::cout << "Oops - not found?\n";
   }
 
   // replace a substring
   std::string dest_string;
   boost::regex_replace(std::back_inserter(dest_string),
                        s.begin(), s.end(),
                        re2,
                        "'m now a changed");
   std::cout << dest_string << std::endl;
 }

Java

Java info: java version "1.5.0_06", Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05), Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

Test

String str = "I am a string";
if (str.matches(".*string$")) {
  System.out.println("ends with 'string'");
}

Substitute

String orig = "I am the original string";
Pattern pat = Pattern.compile("original"); // match "original"
Matcher mat = pat.matcher(orig); // get the Matcher

String result = mat.replaceAll("modified"); // replace all matches against the pattern with "modified"
// result is now "I am the modified string"

Perl

Interpreter: Perl v5.8.8

Test

$string = "I am a string";
if ($string =~ /string$/) {
  print "Ends with 'string'\n";
}

if ($string !~ /^You/) {
  print "Does not start with 'You'\n";
}

Substitute

$string = "I am a string";
$string =~ s/ a / another /; # makes "I am a string" into "I am another string"
print $string;

Test and Substitute

$string = "I am a string";
if ($string =~ s/\bam\b/was/) { # \b is a word border
  print "I was able to find and replace 'am' with 'was'\n";
}

Options

# add the following just after the last / for additional control
# g = globaly (match as many as possible)
# i = case-insensitive
# s = treat all of $string as a single line (incase you have line breaks in the content)
# m = multi-line (the expression is run on each line individually)
 
$string =~ s/i/u/ig; # would change "I am a string" into "u am a strung"

PHP

Interpreter: PHP 5.2.0

$string = 'I am a string';

Test

if (preg_match('/string$/', $string))
{
    echo "Ends with 'string'\n";
}

Replace

$string = preg_replace('/\ba\b/', 'another', $string);
echo "Found 'a' and replace it with 'another', resulting in this string: $string\n";

Ruby

Test

 string="I am a string"
 puts "Ends with 'string'" if string[/string$/]
 puts "Does not start with 'You'" if !string[/^You/]

Substitute

 puts string.gsub(/ a /,' another ')
 #or
 string[/a/]='another'
 puts string

Substitute using block

 puts(string.gsub(/\bam\b/) do |match|
        puts "I found #{match}"
        #place "was" instead of the match
        "was"
      end)