.NET RegEx帮助进行字符串匹配

时间:2012-02-23 21:41:31

标签: .net regex

我需要一些正则表达式的帮助。

我需要搜索“Android 2.2.x”,其中x可以是字符串中的1-9,所以我创建了这个RegEx Androind 2.2。\ d {1}这很好用。

现在我想在字符串

中找到Android 2.2

如果我使用正则表达式“Androind 2.2”进行搜索,它会匹配“Android 2.2”和“Android 2.2.x”但我希望正则表达式只匹配“Android 2.2”

任何人都可以帮助我。

谢谢,

3 个答案:

答案 0 :(得分:2)

使用否定前瞻。 "Android 2.2(?!\.\d)"匹配"Android 2.2"但不匹配"Android 2.2.1""Android 2.2.2""Android 2.2.10"等。如果下一个字符不是数字,它也会匹配"Android 2.2."或者到达string的结尾。

有关详细信息,请参阅Grouping Constructs

答案 1 :(得分:0)

如果此字符串Android 2.2后跟字符串结尾,则可以在匹配字符串结尾的模式后包含$。

否则,您可以执行类似Android 2.2 [^ 0-9。]的操作,以确保此字符串后面没有点或数字。

针对第二种情况的一个论点是你可以有一个字符串 “你正在使用Andoid 2.2。”最后的地方。只是结束一个句子......你想匹配那个字符串吗?

答案 2 :(得分:0)

只是抛弃另一种方法,如果你需要为不同的版本提供不同的行为,你可以这样做:

string pattern = @"Android (?<major>\d+)\.(?<minor>\d+)(\.(?<revision>\d+))?";
Match match = Regex.Match(text, pattern);

if (match.Success)
{
    int major = int.Parse(match.Groups["major"].Value);
    int minor = int.Parse(match.Groups["minor"].Value);
    int revision;

    if (!int.TryParse(match.Groups["revision"].Value, out revision))
        revision = 0;

    if (major == 2 && minor == 2)
    {
        if (revision == 0)
        {
            // Process version 2.2
        }
        else
        {
            // Process version 2.2.x, where x > 0
        }
    }
}

这将匹配主要版本,然后是次要版本,可选地后跟修订版本,并允许您访问这三个数字中的每一个。请注意,如果没有指定修订版,则将其视为0(即"Android 2.2" == "Android 2.2.0")。

您也可以使用Version class执行某些工作,例如:

string pattern = @"Android (?<version>\d+\.\d+(\.\d+)?)";
Match match = Regex.Match(text, pattern);

if (match.Success)
{
    Version version = Version.Parse(match.Groups["version"].Value);

    if (version.Major == 2 && version.Minor == 2)
    {
        if (version.Build < 1)
        {
            // Process version 2.2
        }
        else
        {
            // Process version 2.2.x, where x > 0
        }
    }
}

第三个数字组件称为“Build”,而不是“Revision”。请注意,如果值为0,Build property将返回0,如果未指定值,则返回-1。