我需要过滤给定的文字以获取所有单词,包括撇号(不能被视为单个单词)。
Para = "'hello' world '"
我正在使用
拆分文本String[] splits = Para.split("[^a-zA-Z']");
预期产出:
hello world
但它正在给予:
'hello' world '
我把一切都搞定了,除了单个撇号(')和'你好'没有被上面的正则表达式过滤掉。
如何过滤这两件事?
答案 0 :(得分:1)
据我所知,您正在寻找一个'
,其中下一个或上一个字符不一个字母。
我想出了正则表达式,包含在一些测试代码中:
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'])+"
答案 1 :(得分:1)
Unicode版本,没有外观:
String TestInput = "This voilà München is the test' 'sentence' that I'm willing to split";
String[] splits = TestInput.split("'?[^\\p{L}']+'?");
for (String t : splits) {
System.out.println(t);
}
\p{L}
将字符与Unicode property“字母”匹配
这会拆分非字母,非'序列,包括分割中的前导或尾随。
输出:
此
瞧
慕尼黑
是
该
测试
一句话
该
我
愿意
到
分裂
要处理前导和尾随',只需将它们添加为替代
TestInput.split("'?[^\\p{L}']+'?|^'|'$")
答案 2 :(得分:0)
如果您将单词定义为以下序列:
a-zA-Z
'
)。然后,您可以在Matcher.find()
循环中使用以下正则表达式来提取匹配项:
[a-zA-Z](?:[a-zA-Z']*[a-zA-Z])?
示例代码:
Pattern p = Pattern.compile("[a-zA-Z](?:[a-zA-Z']*[a-zA-Z])?");
Matcher m = p.matcher(inputString);
while (m.find()) {
System.out.println(m.group());
}
Demo 1
1 该演示使用PCRE风格正则表达式,但结果不应与此正则表达式的Java不同