Java 正则表达式捕捉所有单词和;i';我是你';re etc“;在爪哇
我试图通过在Java中创建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
模式来拆分文档的行。
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'
,只需将最后一个+
替换为*
。