Java 查找字符串中的标点符号,然后查找它们的索引以生成子字符串

Java 查找字符串中的标点符号,然后查找它们的索引以生成子字符串,java,string,Java,String,我有一些字符串,需要根据标点符号的第一次出现或数字的第一次出现从中提取子字符串。例如 从Taltz 80mg自动注射器中我需要提取Taltz或从Trulicity 0.75mg,每周我需要提取Trulicity 这是我的密码: char [] punctuations = {'.' , ',' , ';' , ':','"' , '\'' ,'/', ')' , '('}; String value = "Taltz, 80mg autoinjector"; int pos = valu

我有一些字符串,需要根据标点符号的第一次出现或数字的第一次出现从中提取子字符串。例如

Taltz 80mg自动注射器中
我需要提取
Taltz
或从
Trulicity 0.75mg,每周
我需要提取
Trulicity

这是我的密码:

 char [] punctuations = {'.' , ',' , ';' , ':','"' , '\'' ,'/', ')' , '('};

 String value = "Taltz, 80mg autoinjector";
 int pos = value.replaceFirst("^(\\D+).*$", "$1").length();     

                for(int j = 0; j < value.length(); j++) {
                    for (int k = 0; k < punctuations.length;k++){
                        if(value.charAt(j) == punctuations[k]){
                            value = value.substring(0,value.indexOf(punctuations[k]));
                            break;
                        }
                    }
                }

            if(value.matches(".*\\d+.*")){
                value = value.substring(0, pos);
            }

            System.out.println(value);


        }
char[]标点={'.',','.',',';',':',''''''.','\'''''''./','),'('};
字符串值=“Taltz,80mg自动注射器”;
int pos=value.replaceFirst(“^(\\D+).*$”,“$1”).length();
对于(int j=0;j

有更有效的方法吗?

您可以定义要保留的部分,并使用正则表达式捕获它:

String s = "Taltz test 80mg autoinjector";
Pattern pattern = Pattern.compile("([a-zA-Z ]+).*");
Matcher matcher = pattern.matcher(s);

if(matcher.matches()) {
  System.out.println("matches : " + matcher.group(1).trim());
} else {
  System.out.println("Does not match");
}
输出

Taltz test
您还可以使用以下正则表达式捕获“既不是标点符号也不是数字”的所有内容:

Pattern pattern = Pattern.compile("([^0-9;,:.?]+).*");

(相同的输出)

所以,如果字符串是
,我会说,“你好"
,然后你想提取
我说的
?字符串总是以一个词开头,你需要提取这个词吗?@ChandlerBing没错!这些是我试图提取的药物名称,我发现的模式名称是药物名称后面有标点符号或剂量,比如80毫升。所以我试图提取基于这两个假设。@YuriHeiko在大多数情况下是的,但药物名称可能跨越多个单词,使用剂量或标点符号作为指标。我只想提取Taltz而不是Taltz测试。因此,这种方法可能不起作用。我在文本中确定的模式是,我需要提取的单词,在本例中是药物名称后面跟一个标点符号或药物的剂量,因此使用这两个指标中的任何一个作为子字符串。@serendipity为什么不在上面的示例中使用“Taltz测试”呢?您评论说名称可以“跨越多个单词”,那么为什么不在这种情况下呢?@CarlosHeuberger正确的名称应该是类似于盐酸帕拉西普的东西——它指的是整个药物名称。在Taltz测试中,单词test对我来说是垃圾值。因此我必须依赖于药物名称出现的模式,而不是捕获单词并丢弃两者都不是的东西的通用匹配一个标点符号也不是数字。@serendipity但是Java程序如何“知道”这个“测试”是一个垃圾值呢?它显然既不是标点符号也不是数字digit@CarlosHeuberger我知道。这是一个棘手的问题。因此,人们必须依赖“药名后面有标点符号或药物剂量”这样的模式