我正在尝试将一些Java东西移植到C#。我只是想知道以下C#代码是否等同于原始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));
}
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));
}
干杯:)
答案 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文档确认您需要字符串执行的操作: