unicode正则表达式模式不起作用

时间:2013-09-04 13:45:32

标签: java regex unicode

我正在尝试匹配一些unicode字符序列:

Pattern pattern = Pattern.compile("\\u05[dDeE][0-9a-fA-F]{2,}");
    String text = "\\n     \\u05db\\u05d3\\u05d5\\u05e8\\u05d2\\u05dc\\n    <\\/span>\\n<br style=\\";
    Matcher match = pattern.matcher(text);

但这样做会产生以下异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal Unicode escape sequence near index 4
  \u05[dDeE][0-9a-fA-F]+
      ^

如何使用仍然使用正则表达式与一些正则表达式字符(如“[”)来匹配unicode?

编辑: 我正在尝试解析一些文本。某处的文本有一系列Unicode字符,我知道它们的代码范围。

EDIT2: 我现在正在使用范围:[\\u05d0-\\u05ea]{2,}但仍然无法匹配上面的文字

EDIT3: 好的,现在它正在工作,问题是我在正则表达式和文本中使用了两个反斜杠而不是一个。 对此的解决方案是,假设我知道将有两个或更多的字符:

[\u05d0-\u05ea]{2,}

3 个答案:

答案 0 :(得分:7)

以下是导致异常的原因:

\\u05[dDeE][0-9a-fA-F]}{2,}
  ^^^^

java正则表达式解析器认为您正在尝试使用转义序列\uNNNN匹配Unicode代码点,因此它会给出异常,因为\u后面需要四个十六进制数字,并且只有其中两个,即05,因此如果您真正想要它,则需要将其更改为\\u0005

另一方面,如果您想匹配目标字符串中的\\u,那么您需要 quad 转义每个反斜杠\,例如\\\\所以要匹配\\u,您需要\\\\\\\\u

\\\\\\\\u05[dDeE][0-9a-fA-F]}{2,}

最后,如果你想在目标字符串中按字面意思匹配这些Unicode代码点,那么你需要修改我们的最后一个表达式:

(?:\\\\\\\\u05[dDeE][0-9a-fA-F]){2,}

编辑:由于目标字符串中只有一个反斜杠,因此正则表达式应为:

(?:\\\\u05[dDeE][0-9a-fA-F]){2,}

这将匹配字符串中的\u05db\u05d3\u05d5\u05e8\u05d2\u05dc

<\/span><\/span><span dir=\"rtl\">\n \u05db\u05d3\u05d5\u05e8\u05d2\u05dc\n <\/span>\n<br style=\"clear : both; font-size : 1px;\">\n<\/div>"}, 200, null, null);

编辑2 :如果您想匹配文字\u05db\u05d3\u05d5\u05e8\u05d2\u05dc,则无法使用范围。

另一方面,如果您想在05d005df之间匹配Unicode代码点,那么您可以使用:

(?:[\\u05d0\\u05df]){2,}

答案 1 :(得分:0)

目前尚不清楚你要做什么。如果您的目标是简化匹配一系列Unicode字符,那么您需要意识到十六进制数字完全不区分大小写,因此即使您可以拆分字符文字,您的a-fA-F也是多余的。尝试此操作以匹配范围中的所有Unicode字符:

[\\u05d0-\\u0eff]

答案 2 :(得分:0)

您的输入字符串中似乎有不必要的 \\ 。以下工作通过替换正则表达式中指定的unicode字符范围:

String text = "\n  \u05db\u05d3\u05d5\u05e8\u05d2\u05dc\n    </span>\n<br style=\\";
System.out.println(text.replaceAll("[\u05d0-\u05ea]{2,}", "@@@"));

<强>输出:

  @@@
    </span>

请注意,在我们的输入文字中,您已修复了\\n\\u05db等。