Java获取引号之间的内容_如何在Java中获取字符串中双引号之间的字符串

本问题已经有最佳答案,请猛点这里访问。

例如,输入将类似于:

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希望将带引号的字符串解析为单个标记,而不是去除引号。 参见示例所需的输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值