5

我正在尝试匹配一些 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,}
4

3 回答 3

8

以下是导致异常的原因:

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

java 正则表达式解析器认为您正在尝试使用转义序列匹配 Unicode 代码点,\uNNNN因此它给出了异常,因为\u它后面需要四个十六进制数字并且只有两个,也就是说05,您需要将其更改为\\u0005if这就是你真正想要的。

另一方面,如果你想匹配\\u目标字符串,那么你需要像这样对每个反斜杠进行四元转义,以便匹配你需要的 .\\\\\\\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,则不能使用范围。

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

(?:[\\u05d0\\u05df]){2,}
于 2013-09-04T13:50:02.840 回答
0

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

[\\u05d0-\\u0eff]
于 2013-09-04T13:52:34.387 回答
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我已修复的内容。

于 2013-09-04T14:18:55.083 回答