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

时间:2011-12-02 20:26:55

标签: c# java regex

我有以下正则表达式(很久,我知道):

(?-mix:((?-mix:(?-mix:\{\%).*?(?-mix:\%\})|(?-mix:\{\{).*?(?-mix:\}\}?))
|(?-mix:\{\{|\{\%)))

我正在使用分割字符串。它在C#中正确匹配,但是当我将代码移动到Java时,它不匹配。这个正则表达式的任何特殊功能是C#-only吗?

源代码为:

String source = Pattern.quote("{% assign foo = values %}.{{ foo[0] }}.");

在C#中,它是:

string source = @"{% assign foo = values %}.{{ foo[0] }}.";

C#版本是这样的:

string[] split = Regex.split(source, regex);

在Java中,我尝试了两种方法:

String[] split = source.split(regex);

以及

Pattern p = Pattern.compile(regex);
String[] split = p.split(source);

3 个答案:

答案 0 :(得分:4)

以下是一个示例程序,其中包含您的代码:http://ideone.com/hk3uy

Java与其他语言之间存在重大差异:Java不会将捕获的组添加为结果数组中的标记(example)。这意味着所有分隔符都会从结果中删除,但它们将包含在.Net中 我知道的唯一选择是不使用split,而是获取匹配列表并手动拆分。

答案 1 :(得分:2)

我认为问题在于你如何定义source。在我的系统上,这个:

String source = Pattern.quote("{% assign foo = values %}.{{ foo[0] }}.");

相当于:

String source = "\\Q{% assign foo = values %}.{{ foo[0] }}.\\E";

(也就是说,它添加了一个流浪\Q\E),但是定义方法的方式,您的Java实现可以将其视为等效于此:

String source = "\\{% assign foo = values %\\}\\.\\{\\{ foo\\[0\\] \\}\\}\\.";

(即插入大量反斜杠)。

你的正则表达式看起来很好。这个计划:

public static void main(final String... args)
{
    final Pattern p = Pattern.compile("(?-mix:((?-mix:(?-mix:\\{\\%).*?(?-mix:\\%\\})|(?-mix:\\{\\{).*?(?-mix:\\}\\}?))|(?-mix:\\{\\{|\\{\\%)))");
    for(final String s : p.split("a{%b%}c{{d}}e{%f%}g{{h}}i{{j{%k"))
    System.out.println(s);
}

打印

a
c
e
g
i
j
k

即,它成功将{%b%}{{d}}{%f%}{{h}}{{{%视为分裂点,你所期望的所有非贪婪。但是,如果我将p剥离到

,它也会起作用
Pattern.compile("\\{%.*?%\\}|\\{\\{.*?\\}\\}?|\\{\\{|\\{%");

- )

答案 2 :(得分:0)

使用\\{代替\{,也使用其他符号