java - 从字符串中的给定单词中获取下两个单词,同时包含非字母数字字符的单词

标签 java string

我有一个 String 如下:

String str = "This is something Total Toys (RED) 300,000.00 (49,999.00) This is something";

来自用户的输入将是一个关键字 String 即。 玩具总数(红色)

我可以使用 str.indexOf(keyword);

获取关键字的索引

我还可以通过将关键字 String 的长度添加到上述索引来获取下一个单词的开头。

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

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 表格第一列中的标题,接下来我要读取的两个标记是该表格中同一行接下来两列中的值。

最佳答案

您可以使用 regular expressions去做这个。这将适用于后跟两个标记的关键字的所有实例,如果关键字后面没有跟两个标记,则它将不匹配;但是,这很容易适应,因此请说明您是否要在关键字后跟 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",给出:

300,000.00
49,999.00

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

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

如果你想要三个组,使用这个:

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

注意:如果后面只有两个组,组 (3) 将为 null

关于java - 从字符串中的给定单词中获取下两个单词,同时包含非字母数字字符的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20496786/

相关文章:

java - 使用数组在 Android 中创建 TextView

java - 使用 opencsv 搜索

java - org.hibernate.MappingNotFoundException : resource: com/ypd/a/entity/Employee. hbm.xml 未找到

java - 检查字符串是否不为空且不为空

java - 尝试比较字符串和 double

java - 我应该把工作线程放在哪里

regex - 修改 `sed` 以从字符串中删除确切的标签

java - 为什么StringBuilder比String快得多

python - 将字符串设置为变量名

php - 去掉PHP中两个单词之间的空格