使用正则表达式从文本中拆分单词

时间:2014-02-10 08:21:05

标签: java regex

我需要过滤给定的文字以获取所有单词,包括撇号(不能被视为单个单词)。

Para = "'hello' world '"

我正在使用

拆分文本
String[] splits = Para.split("[^a-zA-Z']");

预期产出:

hello world

但它正在给予:

'hello' world '

我把一切都搞定了,除了单个撇号(')和'你好'没有被上面的正则表达式过滤掉。

如何过滤这两件事?

3 个答案:

答案 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不同