Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从字符串中获取下一个令牌?_Java_String_Parsing - Fatal编程技术网

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));
}