我试图通过在 Java 中创建一个 Pattern
来分割文档的行。
WordCount 示例中的默认 Pattern
类似于:"\\s*\\b\\s*"
。
然而,这种模式的问题在于,它将所有内容拆分为一个单词,而我想将诸如(我是,你是,它是)之类的内容保留在一起。到目前为止,我尝试过的是 [a-zA-Z]+'{0,1}[a-zA-Z]*
,
问题是当我有一个测试字符串时,例如:
Pattern BOUNDARY = "[a-zA-Z]+'{0,1}[a-zA-Z]*"
String test = "Hello i'm @£$@you @@can !!be.
然后运行
for(String word : BOUNDARY.split(test){
println(word)}
我没有得到任何结果。理想情况下,我想要得到
Hello
i'm
you
can
be
欢迎任何想法。在 regex101.com 中,我放置的正则表达式就像一个魅力,所以我猜我误解了 Java 部分中的某些内容。
最佳答案
您的初始模式在由 0+ 空格模式包围的单词边界处 split 。第二个模式是匹配子字符串。
像这样使用它:
String BOUNDARY_STR = "[a-zA-Z]+(?:'[a-zA-Z]+)?";
String test = "Hello i'm @£$@you @@can !!be.";
Matcher matcher = Pattern.compile(BOUNDARY_STR).matcher(test);
List<String> results = new ArrayList<>();
while (matcher.find()){
results.add(matcher.group(0));
}
System.out.println(results); // => [Hello, i'm, you, can, be]
请参阅Java demo
注意我使用了匹配的[a-zA-Z]+(?:'[a-zA-Z]+)?
[a-zA-Z]+
- 1 个或多个 ASCII 字母(?:'[a-zA-Z]+)?
- 的可选子字符串'
- 撇号[a-zA-Z]+
- 1 个或多个 ASCII 字母
您还可以使用单词边界包裹模式,以仅匹配用非单词字符括起来的单词,"\\b[a-zA-Z]+(?:'[a-zA-Z ]+)?\\b"
.
要查找所有 Unicode 字母,请使用 "\\p{L}+(?:'\\p{L}+)?"
。
关于java - 正则表达式捕获 Java 中的所有单词和 "i' m you’re 等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46808285/