标题不是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)
提前致谢!
答案 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>
我仍然愿意接受更好的解决方案。