如何从字符串中获取下一个标记?

时间:2015-11-20 19:30:32

标签: java string parsing

我想写一个小算法。

我遇到以下问题:我的dx=.01; dy=.01; x=-3:dx:3; y=-3:dy:3; [X,Y]=meshgrid(x,y); f=X.^2+Y.^2; lr = .1; %learning rate eps = 1e-10; %epsilon threshold tooMuch = 1e5; %limit iterations p = [.1 1]; %starting point [~, idx] = min( abs(x-p(1)) ); %index of closest value [~, idy] = min( abs(y-p(2)) ); %index of closest value p = [x(idx) y(idy)]; %closest point to start [xGrad,yGrad] = gradient(f); %partial derivatives of f xGrad = xGrad/dx; %scale correction yGrad = yGrad/dy; %scale correction for i=1:tooMuch %prevents too many iterations fGrad = [ xGrad(idx,idy) , yGrad(idx,idy) ]; %gradient's definition pTMP = p(end,:) - lr*fGrad; %gradient descent's core [~, idx] = min( abs(x-pTMP(1)) ); %index of closest value [~, idy] = min( abs(y-pTMP(2)) ); %index of closest value p = [p;x(idx) y(idy)]; %add the new point if sqrt( sum( (p(end,:)-p(end-1,:)).^2 ) ) < eps %check conversion break end end 可以包含数字和以下符号: $http.jsonp('https://api.forecast.io/forecast/myapikey/52.370216,4.895168' +'?callback=JSON_CALLBACK')... String-。我想解析它,所以我可以得到每个符号和数字。

我想写的方法(()应该连续返回符号和数字。例如:)应返回:

  • 在第一个电话:getNextToken
  • 在第二个电话:getNextToken("(123-456)-12-1")
  • 第三次致电
  • "("

等等。

我面临的问题是每个数字部分都可以包含几个数字。

我知道写这种功能并不是什么大不了的事,但它不是一个原始的&#34;功能。那么,Java有一个实用类来解决这个问题吗?

3 个答案:

答案 0 :(得分:5)

可以调用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

这是你想要的吗?

答案 1 :(得分:3)

另一个与JohnTeixeira's answer输出相同的正则表达式解决方案:

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

它不使用&#34;不推荐&#34; StringTokenizer课程。您可以找到此正则表达式here的确切详细信息。

答案 2 :(得分: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("((?<=-|[(]|[)])|(?=-|[(]|[)]))"));
System.out.println(splittedStr);
// Output: [(, 123, -, 456, ), -, 12, -, 1]