Java 如何从字符串中获取下一个令牌?
我想写一个小算法 我面临以下问题:我有一个Java 如何从字符串中获取下一个令牌?,java,string,parsing,Java,String,Parsing,我想写一个小算法 我面临以下问题:我有一个字符串,它可以包含数字和以下符号:-,(,)。我想解析它,这样我就可以得到每个符号和数字 我想写的方法(getNextToken)应该依次返回符号和数字。例如:getNextToken(“(123-456)-12-1”)应该返回: 第一次呼叫时:”(“ 第二次呼叫时:“123” 第三次呼叫时:“-” 等等 我面临的问题是,每个数字部分可以包含几个数字 我知道写这种函数没什么大不了的,但它不是一个“原始”函数。那么,Java是否有一个utilit类来解
字符串
,它可以包含数字和以下符号:-
,(
,)
。我想解析它,这样我就可以得到每个符号和数字
我想写的方法(getNextToken
)应该依次返回符号和数字。例如:getNextToken(“(123-456)-12-1”)
应该返回:
- 第一次呼叫时:
”(“
- 第二次呼叫时:
“123”
- 第三次呼叫时:
“-”
我知道写这种函数没什么大不了的,但它不是一个“原始”函数。那么,Java是否有一个utilit类来解决这个问题呢?Java.util.StringTokenizer可以被调用以在标记中包含分隔符
String str = "(123-456)-12-1";
StringTokenizer tokenizer = new StringTokenizer( str,"-()",true);
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
返回
(
123
-
456
)
-
12
-
1
这是您想要的吗?我不确定这是否是您想要的,并且它不是真正可读的。这就是正则表达式的问题:\
String str = "(123-456)-12-1";
String splittedStr = Arrays.toString(str.split("((?<=-)|(?=-)|(?<=[(])|(?=[(])|(?<=[)])|(?=[)]))"));
System.out.println(splittedStr);
// Outputs: [(, 123, -, 456, ), -, 12, -, 1]
String str=“(123-456)-12-1”;
String splittedStr=Arrays.toString(str.split(((?另一个正则表达式解决方案,具有与以下相同的输出):
并且它不使用“不推荐”"StringTokenizer
类。你可以找到这个正则表达式的确切细节。我不确定我是否理解你的问题。举个例子可能会有所帮助。@Mukul Goe在topicI中添加了一个例子。我认为正则表达式可以解决你的搜索问题。也许可以共享你的代码?@RC。很抱歉英语不好。我把1、2、3称为数字,123是数字me.you可以使用char array轻松创建自己的数字解析方法。这没问题,但会产生一些意外结果。例如,如果在原始输入字符串中添加一些空格会发生什么情况?如果要使用spit,可以使用string[]result=str.split(“((?是的,对。你刚才发布的OP或regex恐惧哪个更容易维护?可爱的宝贝jebus people。@markspace True,如果这在问题的范围内。我假设每个令牌都会被检查有效性。如果我们使用String str=“(123-45 6)-12-1”
我们会得到(
..45 6
..1
。如果需要,45 6
可以去除空白,或者,如果作用域要求更严格的操作,无效的标记将抛出异常。@JohnTeixeira空白在解析中非常常见,我认为它一定在问题作用域中。我想可能不是,但这是预先确定的tty不寻常。我认为这解释了您使用的正则表达式的一些问题:
String str = "(123-456)-12-1";
String splittedStr = Arrays.toString(str.split("((?<=-|[(]|[)])|(?=-|[(]|[)]))"));
System.out.println(splittedStr);
// Output: [(, 123, -, 456, ), -, 12, -, 1]
String input = "(123-456)-12-1";
Pattern pattern = Pattern.compile("([()-]|\\d+)");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println(matcher.group(1));
}