Java正则表达式中\w和\b的Unicode等价物?

Java正则表达式中\w和\b的Unicode等价物?

许多现代regex实现解释了\w字符类速记为“任何字母、数字或连接标点符号”(通常为:下划线)。那样的话,就像\w+匹配像这样的单词helloélèveGOÄ_432gefräßig.

不幸的是,Java没有。在Java中,\w仅限于[A-Za-z0-9_]..这使得像上面提到的匹配词很难匹配,还有其他的问题。

似乎\b单词分隔符在不应该匹配的地方匹配。

什么才是与.NET类似的、Unicode感知的正确的等价物?\w\b在爪哇?还有哪些快捷键需要“重写”才能让他们知道Unicode?


哔哔one
浏览 1573回答 3
3回答

侃侃无极

源代码下面讨论的重写函数的源代码在这里可以买到.Java 7中的更新太阳更新Pattern类有一个出色的新标志,UNICODE_CHARACTER_CLASS使一切恢复正常。它可以作为可嵌入的(?U)用于模式内部,因此您可以将其与String班上的包装纸也是。它还修正了其他各种属性的定义。它现在跟踪Unicode标准,在这两个RL1.2和RL1.2a从…UTS#18:Unicode正则表达式..这是一个令人兴奋和戏剧性的改进,开发团队的这一重要工作值得赞扬。Java的Regex Unicode问题Java regexes的问题是Perl1.0字符类转义-意思是\w,&nbsp;\b,&nbsp;\s,&nbsp;\d它们的补充-不是在Java中扩展到与Unicode一起工作的。独自一人在这些,\b享有一定的扩展语义,但这些映射都不是\w,也不去Unicode标识符,也不去Unicode换行属性.此外,以这种方式访问Java中的POSIX属性:POSIX&nbsp;syntax&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;syntax[[:Lower:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Lower}[[:Upper:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Upper}[[:ASCII:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{ASCII}[[:Alpha:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Alpha}[[:Digit:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Digit}[[:Alnum:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Alnum}[[:Punct:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Punct}[[:Graph:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Graph}[[:Print:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Print}[[:Blank:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Blank}[[:Cntrl:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Cntrl}[[:XDigit:]]&nbsp;&nbsp;&nbsp;&nbsp;\p{XDigit}[[:Space:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Space}这真是一团糟,因为这意味着Alpha,&nbsp;Lower,和Space做不在Java映射到UnicodeAlphabetic,&nbsp;Lowercase,或Whitespace财产。这太烦人了。Java的Unicode属性支持是严格每隔一年,我的意思是它不支持在过去十年中出现的Unicode属性。不能正确地谈论空格是非常烦人的。考虑下表。对于这些代码点中的每一个,都有用于Java的J-结果列和用于Perl的P-结果列,或者任何其他基于PCRE的regex引擎:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Regex&nbsp;&nbsp;&nbsp;&nbsp;001A&nbsp;&nbsp;&nbsp;&nbsp;0085&nbsp;&nbsp;&nbsp;&nbsp;00A0&nbsp;&nbsp;&nbsp;&nbsp;2029 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;J&nbsp;&nbsp;P&nbsp;&nbsp;&nbsp;&nbsp;J&nbsp;&nbsp;P&nbsp;&nbsp;&nbsp;&nbsp;J&nbsp;&nbsp;P&nbsp;&nbsp;&nbsp;&nbsp;J&nbsp;&nbsp;P &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\s&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\pZ&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Zs}&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Space}&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\p{Blank}&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;\p{Whitespace}&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&nbsp;1\p{javaWhitespace}&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;- &nbsp;\p{javaSpaceChar}&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;-看到了吗?Unicode称,几乎所有这些JAVA空白结果都是̲w̲r̲o̲n̲g̲。是个很大的问题。Java只是搞砸了,根据现有的实践和Unicode给出的答案都是“错误的”。另外,Java甚至不允许您访问真正的Unicode属性!实际上,Java不支持任何属性,该属性对应于Unicode空白。解决所有这些问题,还有更多为了解决这个问题和许多其他相关问题,昨天我编写了一个Java函数来重写一个模式字符串,该字符串重写了这14个charclass转义:\w&nbsp;\W&nbsp;\s&nbsp;\S&nbsp;\v&nbsp;\V&nbsp;\h&nbsp;\H&nbsp;\d&nbsp;\D&nbsp;\b&nbsp;\B&nbsp;\X&nbsp;\R将它们替换为能够以可预测和一致的方式匹配Unicode的东西。它只是来自一个黑客会话的alpha原型,但它是完全功能的。简而言之,我的代码重写了这14条代码,如下所示:\s&nbsp;=>&nbsp;[\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]\S&nbsp;=>&nbsp;[^\u0009-\u000D\u0020\u0085\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]\v&nbsp;=>&nbsp;[\u000A-\u000D\u0085\u2028\u2029]\V&nbsp;=>&nbsp;[^\u000A-\u000D\u0085\u2028\u2029]\h&nbsp;=>&nbsp;[\u0009\u0020\u00A0\u1680\u180E\u2000-\u200A\u202F\u205F\u3000]\H&nbsp;=>&nbsp;[^\u0009\u0020\u00A0\u1680\u180E\u2000\u2001-\u200A\u202F\u205F\u3000]\w&nbsp;=>&nbsp;[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]\W&nbsp;=>&nbsp;[^\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]\b&nbsp;=>&nbsp;(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))\B&nbsp;=>&nbsp;(?:(?<=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?=[\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])|(?<![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]])(?![\pL\pM\p{Nd}\p{Nl}\p{Pc}[\p{InEnclosedAlphanumerics}&&\p{So}]]))\d&nbsp;=>&nbsp;\p{Nd}\D&nbsp;=>&nbsp;\P{Nd}\R&nbsp;=>&nbsp;(?:(?>\u000D\u000A)|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029])\X&nbsp;=>&nbsp;(?>\PM\pM*)有些事情要考虑.。用于\X定义什么Unicode现在指的是作为遗留字形聚类,而不是扩展字形簇,因为后者更复杂。Perl本身现在使用更高级的版本,但在最常见的情况下,旧版本仍然是完全可行的。编辑:见下文增编。该怎么办\d取决于您的意图,但默认的是Uniode定义。我可以看到人们并不总是想要\p{Nd},但有时[0-9]或\pN.两个边界定义,\b和\B,则是专门编写的,以便使用\w定义。那,那个\w定义过于宽泛,因为它抓住了括号内的字母,而不仅仅是圆圈字母。UnicodeOther_Alphabetic属性在JDK 7之前是不可用的,所以这是您所能做的最好的。探索边界自从拉里·沃尔(LarryWall)第一次发明\b和\B1987年为Perl 1.0讨论它们的语法。理解\b和\B这两项工作都是为了消除关于它们的两个普遍的神话:他们是只看过为\w字,绝不可能非文字字符。它们不专门寻找字符串的边缘。A&nbsp;\b边界指:&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;does&nbsp;follow&nbsp;word &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THEN&nbsp;doesn't&nbsp;precede&nbsp;word &nbsp;&nbsp;&nbsp;&nbsp;ELSIF&nbsp;doesn't&nbsp;follow&nbsp;word &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THEN&nbsp;does&nbsp;precede&nbsp;word这些都被完全直接地定义为:跟随词是(?<=\w).先于文字是(?=\w).不听我的话是(?<!\w).不先于单词是(?!\w).因此,既然IF-THEN被编码为and埃德-一起AB在雷克斯,or是X|Y,因为and的优先级高于or,那是很简单的AB|CD..所以每一个\b这意味着边界可以安全地替换为:&nbsp;&nbsp;&nbsp;&nbsp;(?:(?<=\w)(?!\w)|(?<!\w)(?=\w))带着\w以适当的方式定义。(你可能觉得奇怪的是A和C组件是对立的。在一个完美的世界里,你应该能够写出AB|D,但有一段时间我一直在追寻Unicode属性中的互斥矛盾-我想我已经处理好了,但为了以防万一,我把双重条件留在了边界上。另外,如果以后有额外的想法,这将使它更易于扩展。)为\B无边界,逻辑是:&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;does&nbsp;follow&nbsp;word &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THEN&nbsp;does&nbsp;precede&nbsp;word &nbsp;&nbsp;&nbsp;&nbsp;ELSIF&nbsp;doesn't&nbsp;follow&nbsp;word &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THEN&nbsp;doesn't&nbsp;precede&nbsp;word允许所有的实例\B改为:&nbsp;&nbsp;&nbsp;&nbsp;(?:(?<=\w)(?=\w)|(?<!\w)(?!\w))这才是真正的\b和\B规矩点。它们的等效模式是\b使用((IF)THEN|ELSE)构造是(?(?<=\w)(?!\w)|(?=\w))\B使用((IF)THEN|ELSE)构造是(?(?=\w)(?<=\w)|(?<!\w))但是那些版本AB|CD很好,特别是在正则表达式之类的Java中缺少条件模式的情况下。☹我已经使用所有三个等效定义验证了边界的行为,并使用了一个测试套件来检查每次运行的110,385,408个匹配项,并根据以下几个不同的数据配置运行了这些测试:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7F&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;ASCII&nbsp;range&nbsp;&nbsp;&nbsp;&nbsp;80&nbsp;..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FF&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;non-ASCII&nbsp;Latin1&nbsp;range&nbsp;&nbsp;&nbsp;100&nbsp;..&nbsp;&nbsp;&nbsp;FFFF&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;non-Latin1&nbsp;BMP&nbsp;(Basic&nbsp;Multilingual&nbsp;Plane)&nbsp;range&nbsp;10000&nbsp;..&nbsp;10FFFF&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;non-BMP&nbsp;portion&nbsp;of&nbsp;Unicode&nbsp;(the&nbsp;"astral"&nbsp;planes)然而,人们往往想要一种不同的界限。他们想要的是空格和字符串边缘感知的东西:左缘如(?:(?<=^)|(?<=\s))右缘如(?=$|\s)用Java修复Java我发布的代码我的另一个答案提供了这个和相当多的其他便利。这包括对自然语言单词、破折号、连字符和撇号的定义,再加上更多。它还允许您在逻辑代码点中指定Unicode字符,而不是在愚蠢的UTF-16代名词中指定。很难过分强调这是多么重要!这只是为了字符串的膨胀。对于regex charclass替换,使您的Java regexes中的charclass最后做Unicode的工作,正确地工作,抓取来自这里的全部资料.当然,你可以随心所欲地处理它。如果你修好了,我很想听,但你不必这么做。很短。主regex重写函数的核心很简单:switch&nbsp;(code_point)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'b':&nbsp;&nbsp;newstr.append(boundary); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'B':&nbsp;&nbsp;newstr.append(not_boundary); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'d':&nbsp;&nbsp;newstr.append(digits_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'D':&nbsp;&nbsp;newstr.append(not_digits_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'h':&nbsp;&nbsp;newstr.append(horizontal_whitespace_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'H':&nbsp;&nbsp;newstr.append(not_horizontal_whitespace_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'v':&nbsp;&nbsp;newstr.append(vertical_whitespace_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'V':&nbsp;&nbsp;newstr.append(not_vertical_whitespace_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'R':&nbsp;&nbsp;newstr.append(linebreak); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'s':&nbsp;&nbsp;newstr.append(whitespace_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'S':&nbsp;&nbsp;newstr.append(not_whitespace_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'w':&nbsp;&nbsp;newstr.append(identifier_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'W':&nbsp;&nbsp;newstr.append(not_identifier_charclass); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'X':&nbsp;&nbsp;newstr.append(legacy_grapheme_cluster); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;default:&nbsp;&nbsp;&nbsp;newstr.append('\\'); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newstr.append(Character.toChars(code_point)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;/*&nbsp;switch&nbsp;*/}saw_backslash&nbsp;=&nbsp;false;不管怎么说,这段代码只是一个alpha版本,是我周末黑的东西。不会一直这样。关于测试版,我打算:将代码复制折叠在一起提供关于未转义字符串转义与增强regex转义的更清晰的接口。在\d扩张,也许\b为您提供方便的方法来处理转身和调用Pattern.L.6或String.Match或诸如此类的事情对于生产版本,它应该有javadoc和一个JUnit测试套件。我可能包括我的gigatester,但它不是作为JUnit测试编写的。增编我有好消息和坏消息。好消息是我现在非常近似值扩展字形簇用于改进\X.坏消息是☺的模式是:(?:(?:\u000D\u000A)|(?:[\u0E40\u0E41\u0E42\u0E43\u0E44\u0EC0\u0EC1\u0EC2\u0EC3\u0EC4\uAAB5\uAAB6\uAAB9\uAABB\uAABC]*(?:[\u1100-\u115F\uA960-\uA97C]+|([\u1100-\u115F\uA960-\uA97C]*((?:[[\u1160-\u11A2\uD7B0-\uD7C6][\uAC00\uAC1C\uAC38]][\u1160-\u11A2\uD7B0-\uD7C6]*|[\uAC01\uAC02\uAC03\uAC04])[\u11A8-\u11F9\uD7CB-\uD7FB]*))|[\u11A8-\u11F9\uD7CB-\uD7FB]+|[^[\p{Zl}\p{Zp}\p{Cc}\p{Cf}&&[^\u000D\u000A\u200C\u200D]]\u000D\u000A])[[\p{Mn}\p{Me}\u200C\u200D\u0488\u0489\u20DD\u20DE\u20DF\u20E0\u20E2\u20E3\u20E4\uA670\uA671\uA672\uFF9E\uFF9F][\p{Mc}\u0E30\u0E32\u0E33\u0E45\u0EB0\u0EB2\u0EB3]]*)|(?s:.))在Java中,您可以将其编写为:String&nbsp;extended_grapheme_cluster&nbsp;=&nbsp;"(?:(?:\\u000D\\u000A)|(?:[\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\uAAB5\\uAAB6\\uAAB9\\uAABB\\uAABC]*(?:[\\u1100-\\u115F\\uA960-\\uA97C]+|([\\u1100-\\u115F\\uA960-\\uA97C]*((?:[[\\u1160-\\u11A2\\uD7B0-\\uD7C6][\\uAC00\\uAC1C\\uAC38]][\\u1160-\\u11A2\\uD7B0-\\uD7C6]*|[\\uAC01\\uAC02\\uAC03\\uAC04])[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]*))|[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]+|[^[\\p{Zl}\\p{Zp}\\p{Cc}\\p{Cf}&&[^\\u000D\\u000A\\u200C\\u200D]]\\u000D\\u000A])[[\\p{Mn}\\p{Me}\\u200C\\u200D\\u0488\\u0489\\u20DD\\u20DE\\u20DF\\u20E0\\u20E2\\u20E3\\u20E4\\uA670\\uA671\\uA672\\uFF9E\\uFF9F][\\p{Mc}\\u0E30\\u0E32\\u0E33\\u0E45\\u0EB0\\u0EB2\\u0EB3]]*)|(?s:.))";

四季花海

很不幸\w不管用。提议的解决方案\p{Alpha}对我也不管用。似乎[\p{L}]捕获所有Unicode字母。所以Unicode等效的\w应该是[\p{L}\p{Digit}_].
打开App,查看更多内容
随时随地看视频慕课网APP