【问题标题】:Java Regular Expression to .NETJava 正则表达式到 .NET
【发布时间】:2011-11-11 16:02:06
【问题描述】:

我正在尝试将以下正则表达式从 Java 转换为 .NET:

    (?i:(?:([^\d,]+?)\W+\b((?:CA|SD|SC|CT|DC)\b)?\W*)?(\d{5}(?:[- ]\d{3,4})?)?)

当我对以下字符串进行匹配时:

Mountain View, CA 94043

在 Java 中使用 Pattern 和 Matcher 对象,它使用值填充四个组:

    "Mountain View, CA 94043"
    "Mountain View"
    "CA"
    "94043"

但是,在 .NET 中,有两个匹配项。第一个匹配用这些值填充四个组:

    "Mountain "(there is a space on the end of group 0)
    "Mountain"
    ""
    ""

第二个匹配用这些值填充三个组:

    "View, CA 94043"
    "View"
    "CA"
    "94043"

我还尝试了使用 Java 和 .NET 模式的 RegexBuddy 表达式,在 RegexBuddy 中,这两种模式都像 .NET 版本一样工作。

谢谢大家!

【问题讨论】:

    标签: java .net regex


    【解决方案1】:

    ^ 添加到模式的开头,并在其末尾添加$ 以分别匹配字符串的开头和结尾。这将使模式匹配整个字符串并产生您想要的结果:

    string input = "Mountain View, CA 94043";
    string pattern = @"^(?i:(?:([^\d,]+?)\W+\b((?:CA|SD|SC|CT|DC)\b)?\W*)?(\d{5}(?:[- ]\d{3,4})?)?)$";
    
    Match m = Regex.Match(input, pattern);
    
    foreach (Group g in m.Groups)
    {
        Console.WriteLine(g.Value);
    }
    

    由于您没有将模式限制为完全匹配,如上所述,它发现了部分匹配,特别是因为您的某些组是完全可选的。因此,它将“Mountain”视为匹配项,然后将“View, CA 94043”视为下一个匹配项。

    编辑:根据 cmets 中的要求,我将尝试指出 Java 和 .NET 正则表达式方法之间的区别。

    在 Java 中,如果模式匹配整个字符串,matches() 方法将返回真/假。因此,它不需要使用边界锚或原子零宽度断言来修改模式。在 .NET 中没有这样的等效方法可以为您执行此操作。相反,您需要显式添加 ^$ 元字符,以分别匹配字符串或行的开头和结尾,或者 \A\z 元字符对整个字符串执行相同的操作.有关 .NET 元字符的参考,请查看 this MSDN page。我不确定 Java 的 matches() 使用哪一组锚点,尽管 this article 建议使用 \A\z

    Java 的matches() 返回一个布尔值,而.NET 提供Regex.IsMatch() method 来做同样的事情(除了已经讨论过的匹配整个字符串的区别)。与 Java 的 find() 方法等效的 .NET 方法是 Regex.Match() method,您可以在循环中使用它来继续查找下一个匹配项。此外,.NET 提供了一个Regex.Matches() 方法,可以为您执行此操作,并返回成功匹配的集合。根据您的需要和输入,这可能没问题,但为了增加灵活性,您可能需要在循环中检查Match.Success 并使用Match.NextMatch() method 继续寻找匹配项(NextMatch 中提供了一个示例链接)。

    【讨论】:

    • 如果您添加 Java 的 Matcher.matches 和 .Net 的 Regex.Match 方法之间的差异,我会 +1
    • @CodeJockey 更新了我的帖子。如果我遗漏了什么,请随时提出任何更正建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多