我需要过滤给定的文本以获取所有单词,包括撇号(can't 被视为单个单词)。
Para = "'hello' world '"
我使用分割文本
String[] splits = Para.split("[^a-zA-Z']");
预期输出:
hello world
但它正在给予:
'hello' world '
我一切都正确,除了单个撇号(')和'hello'没有被上面的正则表达式过滤。
如何过滤这两件事?
最佳答案
据我所知,您正在寻找 '
其中下一个或上一个字符不是字母。
我想出的正则表达式来执行此操作,包含在一些测试代码中:
String str = "bob can't do 'well'";
String[] splits = str.split("(?:(?<=^|[^a-zA-Z])'|'(?=[^a-zA-Z]|$)|[^a-zA-Z'])+");
System.out.println(Arrays.toString(splits));
说明:
(?<=^|[^a-zA-Z])'
- 匹配'
其中前一个字符不是字母,或者我们位于字符串的开头。
'(?=[^a-zA-Z]|$)
- 匹配'
其中下一个字符不是字母,或者我们位于字符串的末尾。
[^a-zA-Z']
- 不是字母或 '
.
(?:...)+
- 上述一项或多项( ?:
只是为了使其成为 a non-capturing group )。
参见this有关正则表达式查找的更多信息( (?<=...)
和 (?=...)
)。
简化:
通过使用否定环视,可以将正则表达式简化为以下内容:
"(?:(?<![a-zA-Z])'|'(?![a-zA-Z])|[^a-zA-Z'])+"
关于java - 使用正则表达式从文本中分割单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21672061/