Java regex用于任何语言的字母

时间:2016-09-06 22:03:20

标签: java regex

标题不是100%准确,我已经阅读了相关的问题,虽然即将结束,但他们并没有真正帮助过。

我想分割一个字符串,以便所有非字母字符都是单个项目,可以考虑任何位置的任何字符组合,无论是stard / end的双/三空格等。示例要好得多比我能描述的任何方式:

String: " Hello, Tim! " desired result: {" ", "Hello", ",", " ", "Tim", "!", " ", " "}

String: "Hi 123!&*" desired result: {"Hi", " ", "1", "2", "3", "!", "&", "*"}

String: " الْجُمْلَةُ الاسْمِيَّةُ 2" desired result: {" ", "2", " ", "الْجُمْلَةُ" ,"الاسْمِيَّةُ"}

我尝试的第一个正则表达式是:"\\P{L}"(匹配非类型字母) 这不适用于阿拉伯语或其他复杂的脚本(也尝试过卡纳达语)

第二次尝试:"\\p{Space}|\\p{Punct}|\\p{Digit}"(几乎匹配我要分割的所有字符)。 这样做效果要好得多,任何语言中的单词看起来都很完美,但是对于像double / tripple space这样的东西我会得到不希望的结果,这是一个例子;

String: "Hi " result: {"Hi", " ", " "} (correct)

String: "Hi Hi" result: {"Hi", " ", " ", " ", " ", "Hi"} (incorrect, too many spaces)

提前致谢!

3 个答案:

答案 0 :(得分:1)

这适用于所有语言:

str.split("(?<=\\P{L})|(?=\\P{L})")

它使用后面的外观或非前后的前瞻方式进行分割。

更新

虽然以上适用于&#34;大多数&#34;语言,似乎卡纳达语脚本字符不被视为&#34;字母&#34;。这种解决方法正则表达式打破了空格,数字(任何语言)和标点符号与&#34;非字母&#34;脚本:

str.split("(?<=[\\s\\p{N}\\p{Punct}])|(?=[\\s\\p{N}\\p{Punct}])");

这个使用谷歌翻译创建的阿拉伯语示例有效:

String str = "شكرا  جزيلا";
String[] split = str.split("(?<=\\P{L})|(?=\\P{L})");
System.out.println(Arrays.toString(split));

输出:

[شكرا,  ,  , جزيلا]

答案 1 :(得分:1)

您可能只想使用Character.isLetter(字符)自己编写函数,而不是信任正则表达式。如果你正确行事,Java可能会更快或更快,而且它会更清晰,更简单,更有可能减少错误。

答案 2 :(得分:0)

我目前最好的解决方案就是这个;

"(?<=\\p{Space}|\\p{Punct}|\\p{Digit})|(?=\\p{Space}|\\p{Punct}|\\p{Digit})"

这是波西米亚人的回答,可以在前/后匹配我希望分割的大多数角色。

我想它仍会有问题,Space / Punct / Digit并不是所有非launguage字母,但它在我的测试中仍比P{L}更可靠。< / p>

我仍然愿意接受更好的解决方案。