如何从句子中去掉最后六个单词



我有几个字符串看起来像:

String str1 = "Car honda3454 is unknown in the system";
String str2 = "Car BMW4545 is unknown in the system";
String str3 = "New Car Audi9898 is unknown in the system";
String str4 = "Very old car mitsubishi4099 is unknown in the system";

现在我想删除上面所有字符串中的最后六个单词,这样我的结果字符串应该是:

Car is unknown in the system
Car is unknown in the system
New Car is unknown in the system
Very old car is unknown in the system

我只想从字符串中删除carXXXX。有一个单一或优雅的解决方案吗?

我能想到的最简单的方法是用([^s]+)(?=(s[^s]+){5}$)正则表达式替换。尝试:

String str1 = "Car honda3454 is unknown in the system";
String str2 = "Car BMW4545 is unknown in the system";
String str3 = "New Car Audi9898 is unknown in the system";
String str4 = "Very old car mitsubishi4099 is unknown in the system";
System.out.println(str1.replaceFirst("([^\s]+)(?=(\s[^\s]+){5}$)", ""));
System.out.println(str2.replaceFirst("([^\s]+)(?=(\s[^\s]+){5}$)", ""));
System.out.println(str3.replaceFirst("([^\s]+)(?=(\s[^\s]+){5}$)", ""));
System.out.println(str4.replaceFirst("([^\s]+)(?=(\s[^\s]+){5}$)", ""));

(编辑)
如果您还想删除空格字符,以免有多余的空白字符,请使用S+s+(?=(S+s+){4}S+s*$)

String str1 = "Car honda3454 is unknown in the system";
String str2 = "Car BMW4545 is unknown in the system";
String str3 = "New Car Audi9898 is unknown in the system";
String str4 = "Very old car mitsubishi4099 is unknown in the system";
String strAdditional = "mitsubishi4099 is unknown in the system";

String regex = "\S+\s+(?=(\S+\s+){4}\S+\s*$)";

System.out.println(str1.replaceFirst(regex, ""));
System.out.println(str2.replaceFirst(regex, ""));
System.out.println(str3.replaceFirst(regex, ""));
System.out.println(str4.replaceFirst(regex, ""));
System.out.println(strAdditional.replaceFirst(regex, ""));

说明:

我将使用S+s+(?=(S+s+){4}S+s*$)正则表达式作为示例。它分为两部分:

  • MatchS+s+,它表示您试图捕获的内容
  • 正向前瞻(?=(S+s+){4}S+s*$),它表示需要满足的规则,但不会选择字符

详细介绍我们拥有的第一部分:S+s+

  • S选择任何不代表空白的字符(可以是数字、字母、符号等)
  • +,它链接到上一个选择器,定义它必须至少出现一次,并且可以重复无限次。这保证了一个字符串
  • s选择表示空白的任何字符(可以是制表符、换行符、空白等)
  • +具有与上面相同的功能,但这次允许多个空白

因此,S+选择表示一系列字符的任何字符,直到它被一个(或一系列)空白s+中断。

详述第二部分:(?=(S+s+){4}S+s*$)

  • (?=)包含了所有这部分,被称为积极前瞻。它表示需要满足此处包含的一组规则,但不会选择此文本
  • CCD_ 15再次指示可以表示一个单词的字符串,直到它被空白打断为止。不同的是,这一次它包含在由()分隔的组中,并且该组必须重复4次{4},这意味着4个单词
  • S+s*与第一部分几乎相同,不同之处在于这是最后一个单词,它后面可能包含也可能不包含任何空白字符。s后面的*意味着规则可以满足任何数量的空白字符,即使没有
  • CCD_ 21是表示文本末尾的锚。它表明,在某些方面,必须从文本的结尾到开头对这一规则进行分析

因此,$表示应从末尾开始计数;S+s*对最后一个单词进行计数,该单词后面可能包含空白,也可能不包含空白;CCD_ 24计数最后一个单词之前的四个单词;所有内容都包含在(?=)中,它强制您遵守这些规则,但不会选择与它们匹配的文本。


下面是一个在线示例,解释正则表达式的工作原理:https://regex101.com/r/Lvzog2/1

如果你确定需要删除的单词总是倒数第六,你可以试试这个:

String str1 = "Car honda3454 is unknown in the system";
String new_str=editString(str1);
public static String editString(String str){
String s="";
String[] tokens=str.split(" ");
for(int i=0;i<tokens.length;++i){
if(i!=(tokens.length-6)){
s+=tokens[i]+" ";
}
}
return s;
}

最新更新