Java 和 C# 正则表达式不产生相同的结果

Posted

技术标签:

【中文标题】Java 和 C# 正则表达式不产生相同的结果【英文标题】:Java and C# Regex not producing same result 【发布时间】:2016-11-04 06:31:37 【问题描述】:

我尝试使用正则表达式的一部分将句子拆分为单词。作为其中的一部分,我想拆分诸如“单词”之类的模式。变成“单词”、“.”。为此,我对标点符号使用正向前瞻,对空格字符使用负向前瞻。

在 Java 中,以下代码实现了这一点:

Pattern test = Pattern.compile("(?=[\\pP&&[^']])(?<!\\s)");
test.split("word."); // returns ["word", "."]

但是,当我在 C# 中尝试使用相同的模式时,它不起作用。

Regex.Split("word.", @"(?=[\pP&&[^']])(?<!\s)");
// returns ["word."]

为什么 C# 在这里的行为方式不同?

【问题讨论】:

您为什么希望它的行为方式相同? Java实现一定是错的。 @ScottHannen:这只是正则表达式的不同风格。 对。我希望 Java 和 C# 正则表达式相似,但并非在所有情况下都完全相同。在这种情况下,我不能轻易找到它们不同的原因,所以我问了。 @Matti:我知道,我只是在说些蠢话。 【参考方案1】:

&amp;&amp; 是 Java 特定的正则表达式语法,在 .NET 中不起作用。

但是我认为您应该能够在 .NET 中以更简单的方式重写它,如下所示:

@"(?=[^'\PP])(?<!\s)"

它使用\P 字符类,它是\p 的否定,它被^ 否定并以正确的方式结束。

【讨论】:

另一种写法是(?=[\pP-[']])(只是后面的部分)

以上是关于Java 和 C# 正则表达式不产生相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式 Replace的功能

C# 正则表达式拆分为 Java 模式拆分

正则表达式在 C# 中匹配,但在 java 中不匹配

是否有正则表达式的通用/标准子集?

C# 等效于 Java 标点正则表达式

C# 正则表达式匹配与拆分相同的字符串