gpt4 book ai didi

.NET 的 Java 正则表达式

转载 作者:搜寻专家 更新时间:2023-11-01 02:52:47 25 4
gpt4 key购买 nike

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

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

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

Mountain View, CA 94043

使用 Java 中的模式和匹配器对象,它用值填充四个组:

    "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 版本一样工作。

谢谢大家!

最佳答案

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

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”视为下一个匹配项。

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

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

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

关于.NET 的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8096661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com