Java 从包含非字母数字字符的字符串中的给定单词中获取下两个单词

Java 从包含非字母数字字符的字符串中的给定单词中获取下两个单词,java,string,Java,String,我有一个字符串,如下所示: String str = "This is something Total Toys (RED) 300,000.00 (49,999.00) This is something"; 来自用户的输入将是一个关键字字符串即玩具总数(红色) 我可以使用str.indexOf(关键字)获取关键字的索引 我还可以通过在上面的索引中添加关键字字符串的长度来获得下一个单词的开头 但是,如何获得给定字符串中关键字后的下两个标记,这两个标记是我想要的值 if(str.contain

我有一个
字符串
,如下所示:

String str = "This is something Total Toys (RED) 300,000.00 (49,999.00) This is something";
来自用户的输入将是一个
关键字
字符串
即<代码>玩具总数(红色)

我可以使用
str.indexOf(关键字)获取关键字的索引

我还可以通过在上面的索引中添加关键字
字符串的长度来获得下一个单词的开头

但是,如何获得给定字符串中关键字后的下两个标记,这两个标记是我想要的值

if(str.contains(keyWord)){
 String Value1 = // what should come here such that value1 is 300,000.00 which is first token after keyword string?
 String Value2 = // what should come here such that value2 is (49,999.00) which is second token after keyword string?
}
上下文:使用PDFBox阅读PDF。上面的关键字是PDF中表的第一列中的标题,我要读取的下两个标记是该表中同一行的下两列中的值

类似这样:

String remainingPart= str.substring(str.indexOf(keyWord)+keyWord.length());
StringTokenizer st=new StringTokenizer(remainingPart);
if(st.hasMoreTokens()){
   Value1=st.nextToken();
}
if(st.hasMoreTokens()){
   Value2=st.nextToken();
}
试试这个

String str=“这是一件大事,总计300000.00 49999.00这是一件大事”


鉴于您所提供的,以下是一些有效的方法:

public static void main(String[] args)
{
  String search = "Total Toys";
  String str = "This is something Total Toys 300,000.00 49,999.00 This is something";
  int index = str.indexOf(search);
  index += search.length();
  String[] tokens = str.substring(index, str.length()).trim().split(" ");
  String val1 = tokens[0];
  String val2 = tokens[1];
  System.out.println("Val1: " + val1 + ", Val2: " + val2);
}
输出:

Val1: 300,000.00, Val2: 49,999.00
你可以用它来做这件事。这将适用于后跟两个标记的关键字的所有实例,如果关键字后面没有后跟两个标记,则它将不匹配;但是,这很容易调整,因此如果关键字后面有0或1个标记,请说明是否要匹配

String regex = "(?i)%s\\s+([\\S]+)\\s+([\\S]+)";
Matcher m = Pattern.compile(String.format(regex, Pattern.quote(keyword))).matcher(str);

while (m.find())
{
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}
在您的示例中,
regex
中的
%s
将替换为
“Total Toys”
,给出:

300000.00
49999.00

(?i)
表示不区分大小写
\\s
表示空白
\\S
表示非空白
[…]
是一个
+
表示一个或多个
(…)
是一个捕获组

编辑
如果要使用正则表达式固有的具有特殊字符的关键字,则需要使用
Pattern.quote()
。例如,在正则表达式中,
是特殊字符,因此带有它们的关键字将导致不正确的正则表达式
Pattern.quote()
将它们解释为原始字符,因此它们将在正则表达式中转义,即更改为
\\(
\\)

如果需要三个组,请使用以下选项:

String regex = "%s\\s+([\\S]+)\\s+([\\S]+)(?:\\s+([\\S]+))?";

注意:如果只有两组跟随,则第(3)组将为
null

在字符串中刚找到的关键字索引后,查找第二个空格或行尾。@chuthan20:关键字字符串是动态的,我不知道关键字字符串中的字数,在上面的示例中,关键字字符串是您评论的两个基础!你会在你搜索的关键词后面总是有两个词吗?小心点。如果关键字在字符串中出现多次,则此操作可能无效。对于多个不同的输入,此操作将失败。想一想,警告“在你提供的条件下有效的东西”允许OP根据其他输入做出自己的决定。我的解决方案在给定的条件下是有效的,它只适用于一个基本情况。这就像说你开发了一种除法,它不考虑0的下移,因为在示例输入中从未给出过这种方法……如果关键字后面没有两个标记呢?如果关键字有多个实例呢?@SteveP。谢谢你的输入。如果关键字有多个实例呢?即使值2不存在,我们也应该使用
Value1
吗?我想关键字的第一个实例才是最重要的。至于我不知道的值:)取决于您需要什么,根据官方文档,这个代码doStringTokenizer似乎是一个遗留类,感谢Steve的回复和评论。。但是,如果字符串中的关键字和两个toke类似于“TOTAL TOYS(ONLY)(1234)(5678)”--在这种情况下,Matcher m无法匹配输入字符串中的关键字。。。我需要用大括号修改大小写吗?@Vicky你的意思是说你希望它不区分大小写吗?如果是,则上述内容应与
(仅)
(1234)
匹配,对吗?:是。。但是它没有被匹配。。调用while(m.find())返回时未进入内部!关键字字符串是“Total Toys(红色)”,而输入字符串是“This is something Total Toys(红色)(123)(456)This is something”@Vicky这肯定可以用了。抱歉,我没有意识到这是一个可接受的输入,也没有意识到您希望不区分大小写。祝你好运
String regex = "%s\\s+([\\S]+)\\s+([\\S]+)(?:\\s+([\\S]+))?";