Java 正则表达式捕捉所有单词和;i';我是你';re etc“;在爪哇

Java 正则表达式捕捉所有单词和;i';我是你';re etc“;在爪哇,java,regex,string,Java,Regex,String,我试图通过在Java中创建模式来拆分文档的行。 WordCount示例中默认的模式是这样的:“\\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

我试图通过在Java中创建
模式来拆分文档的行。
WordCount示例中默认的
模式是这样的:
“\\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中,我创建的regex就像一个符咒,所以我猜我误解了Java部分中的某些内容。

您的初始模式是在一个单词边界处分裂的,该边界由0+空格模式包围。第二种模式是匹配子字符串

像这样使用它:

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]
String BOUNDARY_STR=“[a-zA-Z]+(?:”[a-zA-Z]+)?”;
String test=“你好,我是@;$@you@@can!!be.”;
Matcher Matcher=Pattern.compile(BOUNDARY_STR).Matcher(test);
列表结果=新建ArrayList();
while(matcher.find()){
结果:添加(匹配组(0));
} 
System.out.println(结果);//=>[你好,我是,你可以是]

注:我使用了匹配的
[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}+)”

这是一个匹配的正则表达式,请使用
Matcher.find()
获取所有不重叠的匹配项。非常感谢,我想我脑子里出了点问题,只是不确定如何修复它。为什么对可选子字符串使用此语法?它比我的版本更优化吗?如果您使用
a+”?a*
您将匹配
a'
。此外,如果字符串中没有
,则模式将作为
a+a*
工作,这没有什么意义。我的例子涉及较少的回溯。如果需要匹配
a'
,只需将最后一个
+
替换为
*