首页 文章

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

提问于
浏览
6

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

(?-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 回答

  • 4

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

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

  • 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("\\{%.*?%\\}|\\{\\{.*?\\}\\}?|\\{\\{|\\{%");
    

    ;-)

  • 0

    使用 \\{ 而不是 \{ 以及其他符号

相关问题