我对java.util.Scanner有什么错?
这是我的Java 1.5代码(完整示例):我对java.util.Scanner有什么错?,java,Java,这是我的Java 1.5代码(完整示例): 这里出了什么问题?基本上,正则表达式匹配任何以:开头的字符串,即使它只有一个字符::匹配表达式以及:a,:al:alpha。偶数:alpha;beta版是一个匹配 在表达式后面加上问号,即匹配尽可能短的字符串,即: 删除问号以使其贪婪: 但是,它将匹配:alpha;beta版,因此您需要指出,在分号或冒号字符之后,您需要除分号或冒号以外的任何字符: Pattern re = Pattern.compile("(;|:)[^;:]*"); 我认为Sca
这里出了什么问题?基本上,正则表达式匹配任何以
:
开头的字符串,即使它只有一个字符::
匹配表达式以及:a
,:al
<代码>:alpha。偶数:alpha;beta版
是一个匹配
在表达式后面加上问号,即匹配尽可能短的字符串,即:
删除问号以使其贪婪:
但是,它将匹配:alpha;beta版
,因此您需要指出,在分号或冒号字符之后,您需要除分号或冒号以外的任何字符:
Pattern re = Pattern.compile("(;|:)[^;:]*");
我认为Scanner类的工作方式与您预期的不同
Scanner scanner = new Scanner(":alpha;beta");
scanner.useDelimiter("(;|:).*?");
System.out.println(scanner.next()); // gives alpha
如何证明调用
scanner.useDelimiter(“”)的合理性代码>?如果您不使用它,您的匹配器工作得很好。@chiccodoro,解释看起来是正确的,但它不会改变代码的行为:(即使使用“(;(124;:)[^;:])*”
@Vincenzo:可能是Java特有的,默认情况下它不贪婪?那么我建议将您问题的标题改为“Regex与预期不匹配”。这更吸引人,因为Java.util.Scanner不如Regex。此外,在您的问题中包括这些新发现。@Vincenzo:如果您说“(;|:)[^;:]+”
(注意结尾处的加号)?@chiccodoro,我刚刚用一个完整的JUnit示例更新了这个问题。它不起作用,但它应该……或者+
或者*
结尾处是同一个故事:(@Vincenzo:你为什么接受我的答案?你设法解决了吗?是什么让它起作用的?
Pattern re = Pattern.compile("(;|:)[^;:]*");
Scanner scanner = new Scanner(":alpha;beta");
scanner.useDelimiter("(;|:).*?");
System.out.println(scanner.next()); // gives alpha