【问题标题】:How to remove the last-sixth word from sentence如何从句子中删除最后六个单词
【发布时间】:2021-10-31 23:22:34
【问题描述】:

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

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。是否有单行或优雅的解决方案?

【问题讨论】:

  • 不需要进一步说明。我认为社区搞错了。
  • 另外,这是您之前问题的精确副本,间隔 10 分钟发布,唯一的区别是一个标签。请编辑现有问题以进行类似的更改,而不是发布重复的问题。
  • 她显然想删除从句尾算起的第 6 个单词。
  • @user16320675 是的,在你的例子中,它是倒数第 6 个单词。

标签: java regex string


【解决方案1】:

我能想象的最简单的方法是使用 ([^\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*$) 正则表达式为例。分为两部分:

  • Match\S+\s+,代表您尝试捕获的内容。
  • Positive Lookahead(?=(\S+\s+){4}\S+\s*$),表示需要满足的规则,但不会选择字符。

详细说明我们拥有的第一部分:\S+\s+

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

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

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

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

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


这是一个解释正则表达式如何工作的在线示例:https://regex101.com/r/Lvzog2/1

【讨论】:

  • 有多余的空格字符,这就是它无法检查的原因
  • @Sandra 我添加了另一个正则表达式,将多余的字符一起删除。我还包括了另外一行作为测试用例。如果仍然无法解决您的问题,请提供有关可能输入和所需输出的更多详细信息。如果是,请将答案标记为正确。
  • 您好,它工作正常,我将其标记为已接受。您能否详细解释一下这个正则表达式的工作原理?
  • @Sandra 我已经包含了一个解释,以及将最后一个正则表达式更改为更简单的东西,但效果相同。
【解决方案2】:

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

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多