我试图回答一个人的正则表达式问题,我遇到了一些让我挠头的东西。提供以下代码......
public static void main(String[] args) throws IOException {
String test = "Hello, how are you today?";
Pattern p = Pattern.compile("(\\W)+");
String[] words = p.split(test);
System.out.println("--" + words[0] + "--");
System.out.println("--" + words[1] + "--");
}
我得到了
的预期结果--Hello--
--how--
然而,当我使用...
public static void main(String[] args) throws IOException {
String test = "Hello, how are you today?";
Pattern p = Pattern.compile("(\\W)*");
String[] words = p.split(test);
System.out.println("--" + words[0] + "--");
System.out.println("--" + words[1] + "--");
}
我得到了结果
----
--H--
在这种情况下,有没有理由*与+完全不同?
答案 0 :(得分:4)
*
匹配零或更多。结果,一切都变成了分隔符(零宽度分隔符)
顺便说一下,这并不代表它不贪婪地行事。如果你查看返回的字符,你可以得到:
[, H, e, l, l, o, , h, o, w, , a, r, e, , y, o, u, , t, o, d, a, y]
注意" o"之间没有两个空元素。和" h&#34 ;;只有一个。下面,每个分隔符都被{}
包围。
{}H{}e{}l{}l{}o{, }{}h{}o{}w{ }{}a{}r{}e{ }{}y{}o{}u{ }{}t{}o{}d{}a{}y{?}
答案 1 :(得分:4)
因为+
表示一次或更多次出现上次匹配,而*
表示零或更多次出现。
答案 2 :(得分:1)
Kleene星允许重复任何特定项的0或更多,所以如果你打印出整个列表(而不是只有0和1),它可能是字符串中的每个单词字符。使用+保证至少接受一个单词。 (+转换为ww *)。