2017-04-14 146 views
-1

我的目的是找到所有的 “令牌” 和引用字符串与一个String :: split()方法:为什么这个java正则表达式返回false?

(("[\w\s]*")|(\w*))* 

输入文本:

this "a test" abd "and more" 

它总是返回false。

另外,如何“引用”它,以便我可以在源代码中使用它?

+0

在Java中,你不需要双冒号来调用静态函数:: xD –

+0

什么是提醒人们split是String的简写呢?字符串#拆分? – pitosalas

+2

'String.split'返回'String []',所以我不确定它是如何返回false的。你可以用实际输出显示代码和预期输出吗? – Dukeling

回答

1

String.split使用匹配作为分隔符进行分割,即它返回不匹配匹配的所有内容。如果你想返回你正在匹配的内容,你应该使用Matcher.find

此外,\\w*匹配长度为0的字符串,您可能想要避免。使用+来匹配1或更多。

你也有一些不必要的支架和外*不应该存在 - 正则表达式的其余部分已经匹配所有的字符在单令牌和多令牌应该大概是整个正则表达式匹配的多个调用匹配(所以说“任何数量的这些“没有意义)。

Matcher m = Pattern.compile("\"[\\w\\s]*\"|\\w+").matcher("this \"a test\" abd \"and more\""); 
while (m.find()) 
    System.out.println(m.group()); 

上面打印:

this 
"a test" 
abd 
"and more" 

要删除的报价,你可以更新的正则表达式来使用look-around,这将检查"的是有的,但实际上不会与它们匹配:

"(?<=\")\\w[\\w\\s]*(?=\")|\\w+" 

要了解如何逃脱的事情,你需要保持记住不同的层次。首先是Java本身,其中"将开始或结束一个字符串,因此如果您希望"字符出现在字符串中,需要使用\进行转义。然后有正则表达式代码,它预计\w\s,但Java不允许\没有它被转义,所以这是\\w\\s

+0

感谢您提供美丽,完整,工作和有益的答案:) – pitosalas

相关问题