Regular expressions
The goal of this task is
- to match a string against a regular expression
- to substitute part of a string using a regular expression
Regular expressions
You are encouraged to solve this task according to the task description, using any language you may know.
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"
JavaScript
Test/Match
var subject = "Hello world!"; // Two different ways to create the RegExp object // Both examples use the exact same pattern... matching "hello" var re_PatternToMatch = /Hello (World)/i; // creates a RegExp literal with case-insensitivity var re_PatternToMatch2 = new RegExp("Hello (World)", "i"); // Test for a match - return a bool var isMatch = re_PatternToMatch.test(subject); // Get the match details // Returns an array with the match's details // matches[0] == "Hello world" // matches[1] == "world" var matches = re_PatternToMatch2.exec(subject);
Substitute
var subject = "Hello world!"; // Perform a string replacement // newSubject == "Replaced!" var newSubject = subject.replace(re_PatternToMatch, "Replaced");
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";
Python
Interpreter: Python 2.5
Setup
import re str = 'I am a string'
Test
if re.search(r'string$', str): print "Ends with 'string'."
Test, storing the compiled regular expression in a variable
regex = re.compile(r'string$') if regex.search(str): print "Ends with 'string'"
Substitute
str = re.sub(r' a ', ' another ', str)
Substitute, storing the compiled regular expression in a variable
regex = re.compile(r' a ') str = regex.sub(' another ', str)
Note: re.match() and regex.match() imply a "^" at the beginning of the regular expression. re.search() and regex.search() do not.
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)