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.COMMENTS
的 Java
非常接近 RegexOptions.IgnorePatternWhitespace
为 .NET
所做的(除了 Java 标志允许 cmets 也在正则表达式中)
所以当我把测试放在一起时,我看起来像是搞砸了——我在原始代码的正则表达式中有锚点。但我也假设因为正则表达式中有空格,Java 会忽略它们,这就是我出错的地方。
对,Java 正则表达式不会忽略空格,除非你在正则表达式的开头有 Pattern.COMMENTS
或 (?x)
以上是关于C# 中的 Java matchesAt() 等价物的主要内容,如果未能解决你的问题,请参考以下文章
C# 中的 Java RuntimeException 等价物?
Java 和 Scala 中 C# 的访问修饰符的等价物是啥?