代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

如何在Groovy的/pattern/syntax中转义Unicode转义

  •  2
  • polygenelubricants  · 技术社区  · 16 年前

    下面的Groovy命令说明了我的问题。

    as seen on lotrepls.appspot.com )如预期(注意 \u0061 'a' ).

    >>> print "a".matches(/\u0061/)
    
    true
    

    现在假设我们想要匹配 \n ,使用Unicode转义 \u000A . 以下,使用 "pattern" 作为字符串,行为与预期一致:

    >>> print "\n".matches("\u000A");
    
    Interpreter exception: com.google.lotrepls.shared.InterpreterException:
    org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed,
    Script1.groovy: 1: expecting anything but ''\n''; got it anyway
    @ line 1, column 21. 1 error
    

    JLS 3.3 ),所以:

    print "\n".matches("\u000A")
    

    实际上与:

    print "\n".matches("
    ")
    

    >>> print "\n".matches("\\u000A")
    
    true
    

    现在是问题部分:我们如何让它与Groovy一起工作 /pattern/ 语法而不是使用字符串文字?

    以下是一些失败的尝试:

    >>> print "\n".matches(/\u000A/)
    
    Interpreter exception: com.google.lotrepls.shared.InterpreterException:
    org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed,
    Script1.groovy: 1: expecting EOF, found '(' @ line 1, column 19.
    1 error
    
    >>> print "\n".matches(/\\u000A/)
    
    false
    
    >>> print "\\u000A".matches(/\\u000A/);
    
    true
    
    1 回复  |  直到 16 年前
        1
  •  0
  •   Rakesh Malik    16 年前

    ~“[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]”

    似乎在正常工作。根据我看到的文档,双反斜杠不应该与斜杠字符串一起使用,所以我不知道为什么编译器对它们不满意。

        2
  •  0
  •   Vampire    6 年前

    首先,Groovy似乎在这方面有所改变,至少在 https://groovyconsole.appspot.com/ 还有一个本地的Groovy外壳, "\n".matches(/\u000A/) 工作非常好,评估 true .

    如果您再次遇到类似情况,只需使用unicode转义对反斜杠进行编码,如中所示 "\n".matches(/\u005Cu000A/) 然后,unicode转义到字符的转换再次使其成为反斜杠,然后保留regex解析器的序列。

    另一种选择是将反斜杠与 u 例如使用 "\n".matches(/${'\\'}u000A/) "\n".matches('\\' + /u000A/)