Java:将字符串拆分为单独的字符串和整数变量

Java:将字符串拆分为单独的字符串和整数变量,java,string,split,int,Java,String,Split,Int,我一直在寻找一个答案,但我没有幸运地找到一个可以完全帮助我的答案(有人可能知道指向我的方向) 我想把一个字符串分成一个字符串变量和两个整数变量。我想知道是否有任何方法可以使用我发现的字符串拆分方法,并通过其他方式将其用于int变量 代码: 示例输出: Month: Jan Date: 12 Year: 1992 根据您的评论,使用扫描仪进行编码。我想你想要 userMonth = inSS.next(); userDate = inSS.nextInt(); userYear = inSS.n

我一直在寻找一个答案,但我没有幸运地找到一个可以完全帮助我的答案(有人可能知道指向我的方向)

我想把一个字符串分成一个字符串变量和两个整数变量。我想知道是否有任何方法可以使用我发现的字符串拆分方法,并通过其他方式将其用于int变量

代码:

示例输出:

Month: Jan
Date: 12
Year: 1992

根据您的评论,使用
扫描仪进行编码。我想你想要

userMonth = inSS.next();
userDate = inSS.nextInt();
userYear = inSS.nextInt();
但是如果你的作业不需要
扫描器
,那么你当然可以取消它,使用类似

String userInput = "Jan 12 1992";
String[] tokens = userInput.split("\\s+"); // <-- split on one or more spaces
String userMonth = tokens[0];
int userDate = Integer.parseInt(tokens[1]);
int userYear = Integer.parseInt(tokens[2]);
stringuserinput=“1992年1月12日”;

String[]tokens=userInput.split(\\s+);// 似乎您正在处理日期字符串,最好使用特定的库

Java8

import java.time.format.DateTimeFormatter;
import java.time.temporal.*;

TemporalAccessor d = DateTimeFormatter.ofPattern("MMM DD yyyy").parse("Jan 12 1992")
d.get(ChronoField.YEAR); // 1992
d.get(ChronoField.MONTH_OF_YEAR); // 1
d.get(ChronoField.DAY_OF_MONTH); // 12
在Java8之前(Java.text.simpleDataFormat)

或者使用JodaTime

DateTimeFormat.forPattern("MMM DD yyyy").parseDateTime("Jan 12 1992");

我不想用大锤敲碎一个螺母:-),但根据应用程序中提供的输入所需的灵活性,您可以使用解析器来解决问题。如果您采用下面的语法并将其放入,您可以解析输入字符串并从中提取语义元素。您甚至可以处理不同的输入排列,例如
1999年1月12日
1999年3月12日
,等等

grammar SimpleMixed;
fragment A:('a'|'A');
fragment B:('b'|'B');
fragment C:('c'|'C');
fragment D:('d'|'D');
fragment E:('e'|'E');
fragment F:('f'|'F');
fragment G:('g'|'G');
fragment H:('h'|'H');
fragment I:('i'|'I');
fragment J:('j'|'J');
fragment K:('k'|'K');
fragment L:('l'|'L');
fragment M:('m'|'M');
fragment N:('n'|'N');
fragment O:('o'|'O');
fragment P:('p'|'P');
fragment Q:('q'|'Q');
fragment R:('r'|'R');
fragment S:('s'|'S');
fragment T:('t'|'T');
fragment U:('u'|'U');
fragment V:('v'|'V');
fragment W:('w'|'W');
fragment X:('x'|'X');
fragment Y:('y'|'Y');
fragment Z:('z'|'Z');

s: userinput EOF;
userinput: month date year
    | month year date
    | year month date
    | year date month
    | date year month
    | date month year;

month: Month;
date: Date;
year: Year;
Month: J A N |  F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P      |
O C T | N O V | D E C;

Date: [1-9][0-2]?;

Year: [1-9][0-9][0-9][0-9];


WS  :  [ \t\r\n]+ -> skip;
让我们假设用户提供输入
1999年1月12日
。使用上面语法中从Antlr生成的解析器对其进行解析后,您将获得下面的解析树,从中可以轻松提取语义元素,根据这些语义元素可以推断数据类型并创建适当的对象(例如,int表示年份和日期,String表示月份)


查看最简单的方法是要求用户分别输入日期、月份和年份(3次调用扫描仪),并分别验证每个日期。此答案仅适用于安装的java版本为1.8+的情况@今年的Lukelemonth仍然需要是StringOP,因为它处理的是日期时间,我们不要让问题复杂化,也不要使用正确的日期时间库。因此,使用下一个方法将完成并跳过我声明的任何值?@Aramza我不确定你在问什么,你有
inSS=new Scanner(userInput)
表示您的
扫描仪正在读取预定义的
字符串。
next()
读取一个
String
(Jan),
nextInt
读取12,第三个
nextInt
读取1992。在第二个版本中,我跳过
扫描器
,使用
String.split
DateTimeFormat.forPattern("MMM DD yyyy").parseDateTime("Jan 12 1992");
grammar SimpleMixed;
fragment A:('a'|'A');
fragment B:('b'|'B');
fragment C:('c'|'C');
fragment D:('d'|'D');
fragment E:('e'|'E');
fragment F:('f'|'F');
fragment G:('g'|'G');
fragment H:('h'|'H');
fragment I:('i'|'I');
fragment J:('j'|'J');
fragment K:('k'|'K');
fragment L:('l'|'L');
fragment M:('m'|'M');
fragment N:('n'|'N');
fragment O:('o'|'O');
fragment P:('p'|'P');
fragment Q:('q'|'Q');
fragment R:('r'|'R');
fragment S:('s'|'S');
fragment T:('t'|'T');
fragment U:('u'|'U');
fragment V:('v'|'V');
fragment W:('w'|'W');
fragment X:('x'|'X');
fragment Y:('y'|'Y');
fragment Z:('z'|'Z');

s: userinput EOF;
userinput: month date year
    | month year date
    | year month date
    | year date month
    | date year month
    | date month year;

month: Month;
date: Date;
year: Year;
Month: J A N |  F E B | M A R | A P R | M A Y | J U N | J U L | A U G | S E P      |
O C T | N O V | D E C;

Date: [1-9][0-2]?;

Year: [1-9][0-9][0-9][0-9];


WS  :  [ \t\r\n]+ -> skip;