C# 中的 Java matchesAt() 等价物

Posted

技术标签:

【中文标题】C# 中的 Java matchesAt() 等价物【英文标题】:Java matchesAt() equivalent in C# 【发布时间】:2018-05-17 21:18:12 【问题描述】:

我已经发现了问题C#/.NET equivalent for Java's Matcher.matches() and Matcher.lookingAt(),但是对于lookingAt() 的规定答案似乎不起作用。

我能找到的所有lookingAt() documentation 似乎都表明lookingAt() 方法从“区域”的开头匹配(尽管不清楚“区域”是否与“字符串”同义) .

我有一组示例测试,我用 Java 和 .NET 放在一起,但我得到了不同的结果。

Java

@Test
public void TestRegex()

    String input = "자\uD83E????????"; // "자????????????";
    String regex = ". () [\uD800-\uDFFF]";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher("");

    Matcher m = matcher.reset(input);
    Boolean matches = m.lookingAt(); // Returns false

.NET

[Test]
public void TestRegex()

    String input = @"\A(?:" + "자\uD83E????????" + ")"; // "자????????????" 
    String regex = ". () [\uD800-\uDFFF]";
    Regex pattern = new Regex(regex, RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace);

    Match m = pattern.Match(input);
    Boolean matches = m.Success; // Returns true

我已经排除了空格或奇怪的空捕获组的任何问题 - 无论它们是否存在,我都会得到相同的结果。

我也尝试将 .NET 中的正则表达式更改为 "자\uD83E????????" 并使用 m.Success && m.Index == 0 作为条件,但结果完全相同。当然,我尝试了字符串文字和十六进制字符,结果是一样的。

明确地说,我正在将应用程序从 Java 移植到 .NET。我正在尝试在 .NET 中找到与 lookingAt() 等效的功能。

那么我需要在 .NET 中进行哪些更改以使其与 Java 中的 .lookingAt() 相同?更重要的是,为什么这种特殊情况会在 Java 中返回 false,而我希望它会像在 .NET 中一样返回 true

以防万一,我使用的是 .NET Standard 1.3 和 Java 1.8,兼容 1.6。

【问题讨论】:

【参考方案1】:

在 Java 中,您需要使用 Pattern.COMMENTS 标志来允许在您的正则表达式中使用 cmets 和任意空格:

Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);

您也可以在正则表达式的开头使用(?x) 以获得相同的效果:

String regex = "(?x). () [\uD800-\uDFFF]";
Pattern pattern = Pattern.compile(regex);

现在matches 将为 Java 代码显示 true


现在要使 .NET 正则表达式等效于 Java 的 lookngAt(),只需使用开始锚点:

String regex = @"\A. () [\uD800-\uDFFF]";

请注意,您在输入字符串中使用锚点,而不是在正则表达式中。

【讨论】:

嗯......所以没有它我需要一个文字空格字符,就像没有.NET中的RegexOptions.IgnorePatternWhitespace一样? 是的,没错。 Pattern.COMMENTSJava 非常接近 RegexOptions.IgnorePatternWhitespace.NET 所做的(除了 Java 标志允许 cmets 也在正则表达式中) 所以当我把测试放在一起时,我看起来像是搞砸了——我在原始代码的正则表达式中有锚点。但我也假设因为正则表达式中有空格,Java 会忽略它们,这就是我出错的地方。 对,Java 正则表达式不会忽略空格,除非你在正则表达式的开头有 Pattern.COMMENTS(?x)

以上是关于C# 中的 Java matchesAt() 等价物的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 Java RuntimeException 等价物?

Java 和 Scala 中 C# 的访问修饰符的等价物是啥?

java.util.regex 的 C# 等价物是啥?

C#中超级关键字的等价物

什么是 C# 中 Java 的 ByteBuffer.wrap 的等价物?

C# 中的 Promise 等价物