You can place place conditions on what should occur before or after a match, through lookbehind, lookahead, anchors, and word boundaries.
These are called zero-width assertions.
| Expression | Meaning |
|---|---|
| ^ | Start of string (or line in multiline mode) |
| $ | End of string (or line in multiline mode) |
| \A | Start of string (ignores multiline mode) |
| \z | End of string (ignores multiline mode) |
| \Z | End of line or string |
| \G | Where search started |
| \b | On a word boundary |
| \B | Not on a word boundary |
| (?=expr) | Continue matching only if expression expr matches on right (positive lookahead) |
| (?!expr) | Continue matching only if expression expr doesn't match on right (negative lookahead) |
| (?<=expr) | Continue matching only if expression expr matches on left (positive lookbehind) |
| (?<!expr) | Continue matching only if expression expr doesn't match on left (negative lookbehind) |
| (?>expr) | Subexpression expr is matched once and not backtracked |
The (?=expr) construct checks whether the text that follows matches expr, without including expr in the result.
This is called positive lookahead.
In the following example, we look for a number followed by the word "miles":
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
Console.WriteLine (Regex.Match ("25 miles", @"\d+\s(?=miles)"));
}
}
The output:
25
The word "miles" was not returned in the result, even though it was required to satisfy the match.
If we append .* to our expression as follows:
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
Console.WriteLine (Regex.Match ("25 miles more", @"\d+\s(?=miles).*"));
}
}
The output:
25 miles more
Suppose a password has to be at least six characters and contain at least one digit.
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string password = "...";
bool ok = Regex.IsMatch (password, @"(?=.*\d).{6,}");
}
}
(?!expr) is the negative lookahead construct.
This requires that the match not be followed by expr.
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string regex = "(?i)C#(?!.*(XML|Java))";
Console.WriteLine (Regex.IsMatch ("C#! Java...", regex));
Console.WriteLine (Regex.IsMatch ("C#! SQL!", regex));
}
}
The output:
False
True(?<=expr) denotes positive lookbehind and requires that a match be preceded by a specified expression.
(?<!expr), denotes negative lookbehind and requires that a match not be preceded by a specified expression.
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
string regex = "(?i)(?<!Java.*)Sql";
Console.WriteLine (Regex.IsMatch ("Java, Sql...", regex));
Console.WriteLine (Regex.IsMatch ("Java C#!", regex));
}
}
The output:
False
Falsejava2s.com | | Contact Us | Privacy Policy |
| Copyright 2009 - 12 Demo Source and Support. All rights reserved. |
| All other trademarks are property of their respective owners. |