本问题已经有最佳答案,请猛点这里访问。
例如,输入将类似于:
AddItem rt456 4 12 BOOK"File Structures""Addison-Wesley""Michael Folk"
我想使用扫描仪读取所有内容并将其放入数组中。
喜欢:
info[0] = rt456
info[1] = 4
..
..
info[4] = File Structures
info[5] = Addison-Wesley
那么如何获取引号之间的字符串?
编辑:我的代码的一部分->
public static void main(String[] args) {
String command;
String[] line = new String[6];
Scanner read = new Scanner(System.in);
Library library = new Library();
command = read.next();
if(command.matches("AddItem"))
{
line[0] = read.next(); // Serial Number
line[1] = read.next(); // Shelf Number
line[2] = read.next(); // Shelf Index
command = read.next(); // Type of the item."Book" -"CD" -"Magazine"
if(command.matches("BOOK"))
{
line[3] = read.next(); // Name
line[4] = read.next(); // Publisher
line[5] = read.next(); // Author
Book yeni = new Book(line[0],Integer.parseInt(line[1]),Integer.parseInt(line[2]),line[3],line[4],line[5]);
}
}
}
所以我用read.next读取不带引号的字符串。
通过使用REGEX AS解决
read.next("([^"]\\S*|".+?")\\s*");
阅读Book之后,将分隔符更改为"。或使用将空格作为分隔符的CSV解析器。
new StreamTokenizer(new StringReader(mystring))应该可以解决问题。
字段数,字段位置每次都相同吗?
你为什么不逃避他们?"->"
@MironBalcerzak因为那不是他说的,他根本不想做。
"或" ??双引号是您出色地键入的内容?
我没有问题,您要从字符串中删除",还是要通过""查找文本?
@JohnnyAW他们两个。我想删除它们,但也需要它们之间的值作为字符串。
@JohnnyAW当他明确列出了所需的输出数组时,他想完全按照他说的去做。
@ user3485583您实际上在使用"和"吗?还是使用标准的普通旧"?
@JasonC那个链接挽救了我的一天,谢谢:)
@ user3485583根据您的最后编辑,您是不是说您曾经这样使用过,问题已得到解决line[3] = read.next("([^"]\\S*|".+?")\\s*");System.out.println(line[3]);
您可以在紧急情况下使用StreamTokenizer。如果在String上操作,请用StringReader包裹它。如果对文件进行操作,只需将Reader传递给它。
// Replace" and" with" to make parsing easier; do this only if you truly are
// using pretty quotes (as you are in your post).
inputString = inputString.replaceAll("[""]",""");
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(inputString));
tokenizer.resetSyntax();
tokenizer.whitespaceChars(0, 32);
tokenizer.wordChars(33, 255);
tokenizer.quoteChar('"');
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
// tokenizer.sval will contain the token
System.out.println(tokenizer.sval);
}
您将必须对非ASCII文本使用适当的配置,以上仅是示例。
如果要单独提取数字,则默认的StreamTokenizer配置很好,尽管它使用double并且不提供int数字令牌。令人烦恼的是,如果不从头开始重置语法,就不可能简单地禁用数字分析。
如果您不想弄乱所有这些,也可以考虑将输入格式更改为更方便的格式,如适当的话,如Steve Sarcinella的建议一样。
作为参考,请看一下:扫描器文档
您如何从扫描仪读取数据取决于您将数据呈现给用户的方式。
如果他们在一行上全部输入:
Scanner scanner = new Scanner(System.in);
String result ="";
System.out.println("Enter Data:");
result = scanner.nextLine();
否则,如果将其拆分为输入字段,则可以执行以下操作:
Scanner scanner = new Scanner(System.in);
System.out.println("Enter Identifier:");
info[0] = scanner.nextLine();
System.out.println("Enter Num:");
info[1] = scanner.nextLine();
...
如果要在将数据分配给变量之前验证任何内容,请尝试使用scanner.next("");,其中引号包含要匹配的正则表达式模式
编辑:
在此处查看正则表达式信息。
例如,说我有一个字符串
String foo ="The cat in the hat";
regex(正则表达式)可用于以非常快速有效的方式操作此字符串。如果我使用该字符串并执行foo = foo.replace("\\s+","");,这将什么都替换为空白,因此消除了空白。
分解参数\\s+,我们得到\s,这意味着匹配任何空白字符。
\s之前的多余\是转义字符,可以正确读取\s。
+表示与上一个表达式匹配0次或更多次。 (全部匹配)。
因此,执行替换操作后,foo将是" TheCatInTheHat"
相同的此正则表达式逻辑可以应用于scanner.next(String regex);
希望这会有所帮助,我不是最擅长的解释:)
+1好建议,分成多个字段-更改输入格式是一种非常简单的方法。
我用第一个。 但是我不怎么使用正则表达式。
一种使用凌乱的正则表达式的替代方法:
public static void main(String[] args) throws Exception {
Pattern p = Pattern.compile("^(\\w*)[\\s]+(\\w*)[\\s]+(\\w*)[\\s]+(\\w*)[\\s]+(\\w*)[\\s]+["](.*)["][\\s]+["](.*)["][\\s]+["](.*)["]");
Matcher m = p.matcher("AddItem rt456 4 12 BOOK"File Structures""Addison-Wesley""Michael Folk"");
if (m.find()) {
for (int i=1;i<=m.groupCount();i++) {
System.out.println(m.group(i));
}
}
}
打印:
AddItem
rt456
4
12
BOOK
File Structures
Addison-Wesley
Michael Folk
我认为引号是您在问题""而不是""中键入引号时使用的引号,因此不需要转义。
您能解释一下您的正则表达式吗? 哦,它已经被接受为答案。 因此用户无需知道代码在做什么就可以复制粘贴
我也觉得正则表达式是这样做的方式,可能是因为我是StreamTokenizer的新手
几个字母数字组 w在 s +和三个组["](。*)["]引号,字符组引号之间具有一个或多个空格。 这不是虚幻的。 它按组列出。 可能可以做得更好,更简单
你可以试试看我已经根据您的要求准备了演示
public static void main(String args[]) {
String str =""ABC DEF"";
System.out.println(str);
String str1 = str.replaceAll(""","");
System.out.println(str1);
}
阅读后,只需将双引号替换为空字符串
这不会产生OP描述的输出。 OP希望将带引号的字符串解析为单个标记,而不是去除引号。 参见示例所需的输出。