这段代码从Java到c#是否正确?

时间:2009-01-26 00:24:34

标签: c# java regex

我正在尝试将一些Java东西移植到C#。我只是想知道以下C#代码是否等同于原始Java源代码。

来源:Java代码

private static final Pattern SIMPLE_IDENTIFIER_NAME_PATTERN = 
    Pattern.compile("^[a-zA-Z_][a-zA-Z0-9_]*$");

    private static boolean isValidIdentifier(String s) {
        Matcher m = SIMPLE_IDENTIFIER_NAME_PATTERN.matcher(s);
        return (m.matches() && !reserved.contains(s));
    }

目的地:C#代码

private static readonly Regex SIMPLE_IDENTIFIER_NAME_PATTERN = 
    new Regex("^[a-zA-Z_][a-zA-Z0-9_]*$", RegexOptions.Compiled);

private static bool IsValidIdentifier(string s)
{
    Match match = SIMPLE_IDENTIFIER_NAME_PATTERN.Match(s);
    return (match.Success && !Reserved.Contains(s));
}

干杯:)

4 个答案:

答案 0 :(得分:3)

根据我的评论,我认为您应该编写一个单元测试(或测试)来验证端口是否按预期工作。

答案 1 :(得分:1)

看起来不错,但为什么不首先移植单元测试?

答案 2 :(得分:1)

您使用Caret和Dollar表示您希望匹配主题字符串中的嵌入换行符,而不是整个字符串的开头和结尾。如果是这样,那么你一定要为Regex设置RegexOptions.Multiline选项。如果您没有设置该选项,您的Caret和Dollar将没有特别的含义。

private static readonly Regex SIMPLE_IDENTIFIER_NAME_PATTERN = new Regex("^[a-zA-Z_][a-zA-Z0-9_]*$", RegexOptions.Compiled | RegexOptions.Multiline);

评估编译此正则表达式的必要性也是值得的。是否需要重复使用(例如,在循环中)?如果没有,那么你的正则表达式实际上会有较低的性能。

除此之外,您的转化似乎有效。正如其他一些人所建议的那样,合理确定的唯一方法是对其进行单元测试。

答案 3 :(得分:0)

请注意,只读类型不是不可变的。这意味着您无法更改指向的正则表达式的引用,但您可以更改正则表达式对象本身。 (幸运的是,关于正则表达式的合同不会让你改变表达式)

请注意.Net正则表达式语法与* nix正则表达式语法不同,因此您可能会被咬到那里。根据MSDN文档确认您需要字符串执行的操作:

MSDN Regex Syntax

相关问题