【问题标题】:How to trim substrings after a non-letter token in Java如何在Java中的非字母标记之后修剪子字符串
【发布时间】:2018-06-22 22:22:43
【问题描述】:

我有一个字符串。在我的代码中,如果有的话,我试图在非字母标记之后修剪子字符串。您认为这样做更好的方法是什么?

我尝试使用正则表达式拆分、替换所有函数和匹配函数,但无法提供好的解决方案。

String initialString = "Brown 1fox jum'ps over 9 the_t la8zy dog.";
String[] splitString = initialString.split(" ");
String finalString= new String();   
for (int i = 0; i < splitString.length; i++) {
    finalString+=splitString[i].split("[^a-zA-Z]",2)[0]+" ";
}
finalString=finalString.trim().replaceAll("\\s+", " ");

实际结果(如预期)“Brown jum over the la dog”

【问题讨论】:

  • “我尝试使用正则表达式拆分、替换所有函数和匹配函数,但无法实现”向我们展示。也许你很接近。
  • 我能想到的唯一方法是拆分每个元素并检查它们是否包含以非字母标记开头的部分,如果是,请将其删除。但这对我来说似乎效率低下。我现在正在努力,以防万一没有人想出更好的主意。

标签: regex java-8 split trim


【解决方案1】:

您也可以使用[^a-zA-Z ]+\S* 将匹配项替换为空字符串,然后使用 \\s{2,} 将双空格字符替换为单个字符

String string = "Brown 1fox jum'ps over 9 the_t la8zy dog.";
String result = string.replaceAll("[^a-zA-Z ]+\\S*", "").replaceAll("\\s{2,}", " ");

Demo

【讨论】:

    【解决方案2】:

    你所要做的就是这个,

    String initialString = "Brown 1fox jum'ps over 9 the_t la8zy dog.";
    String resultStr = Stream.of(initialString.split(" "))
        .map(s -> s.replaceAll("[^A-Za-z].*", ""))
        .filter(s -> !s.isEmpty())
        .collect(Collectors.joining(" "));
    

    【讨论】:

    • initialString.split(" ") 返回一个array,所以使用Arrays.stream(initialString.split(" ")) 而不是Stream.of
    • 似乎从 jdk-11 开始我们将能够做到:Predicate.not(String::isEmpty) 而不是 s -&gt; !s.isEmpty()
    • @Eugene 使用Arrays.stream 代替Stream.of 可以获得什么好处?
    猜你喜欢
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多