java - 正则表达式捕获 Java 中的所有单词和 "i' m you’re 等

标签 java regex string

我试图通过在 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/

相关文章:

java - 如何防止 View 在第一次调用后加载多次?

java - 复制 Android 主页 GridView

java - KitKat DownloadManager 未返回正确的 COLUMN_REASON

java - 在 Java 中解析 CSV,仅当内容包含逗号时才应用文本限定符

python - 将字符串转换为元组对的序列

c - C 中的 Vigenere 密码不起作用

java - 使用 MaterializeCSS 和 Thymeleaf 进行复选框输入

RegEx - 如何摆脱这两个括号之间的所有内容,包括括号?

regex - 配置单元查询 regexp_extract

尝试迭代返回字符串时出现 C++ 错误