Contents

Groovy中字符串删除前缀

1. 简介

在这个快速教程中,我们将学习如何在Groovy 中从字符串中删除前缀。

首先,我们将看看String类为此提供了什么。之后,我们将继续讨论正则表达式,看看我们如何使用它们来删除前缀。

2. 使用String方法

一般来说,Groovy 被认为是 Java 生态系统的动态语言。因此,我们仍然可以使用每个 Java String类方法以及新的 Groovy 方法。但是,对于删除前缀,仍然没有像*removePrefix()*这样的简单方法。

从 Groovy 字符串中删除前缀包括两个步骤:首先是确认,然后是删除。这两个步骤都可以使用StringGroovyMethods类来执行,该类提供了许多用于字符串操作的实用方法。

2.1. *startsWith()*方法

startWith()方法测试字符串是否以特定前缀开头。如果前缀存在则返回true ,否则返回false

让我们从一个时髦的闭包 开始:

@Test 
public void whenCasePrefixIsRemoved_thenReturnTrue(){
    def trimPrefix = {
        it.startsWith('Groovy-') ? it.minus('Groovy-') : it 
    }
    def actual = trimPrefix("Groovy-Tutorials at Blogdemo")
    def expected = "Tutorials at Blogdemo"
    assertEquals(expected, actual)
}

一旦确认存在,那么我们也可以使用*substring()*方法将其删除:

trimPrefix.substring('Groovy-'.length())

2.2. startsWithIgnoreCase() 方法

*startsWith()方法区分大小写。因此,需要通过应用toLowerCase()toUpperCase()*方法来消除大小写的影响。

顾名思义,*startsWithIgnoreCase()*在不考虑大小写的情况下搜索前缀。如果存在前缀,则返回 true,否则返回 false。

让我们看看如何使用这个方法:

@Test
public void whenPrefixIsRemovedWithIgnoreCase_thenReturnTrue() {
    String prefix = "groovy-"
    String trimPrefix = "Groovy-Tutorials at Blogdemo"
    def actual
    if(trimPrefix.startsWithIgnoreCase(prefix)) {
        actual = trimPrefix.substring(prefix.length())
    }
    def expected = "Tutorials at Blogdemo"
    assertEquals(expected, actual)
}

2.3. startsWithAny() 方法

当我们只需要检查一个前缀时,上述解决方案很有用。在检查多个前缀时,Groovy 还提供了检查多个前缀的支持。 **startsWithAny()方法检查CharSequence是否以任何指定的前缀开头。**前缀确定后,我们可以根据需求应用逻辑:

String trimPrefix = "Groovy-Tutorials at Blogdemo"
if (trimPrefix.startsWithAny("Java", "Groovy", "Linux")) {
    // logic to remove prefix
}

3. 使用正则表达式

正则表达式是匹配或替换模式的强大方法。Groovy 有一个模式运算符 ~ ,它提供了一种创建java.util.regex.Pattern实例的简单方法。

让我们定义一个简单的正则表达式来删除前缀:

@Test
public void whenPrefixIsRemovedUsingRegex_thenReturnTrue() {
    def regex = ~"^groovy-"
    String trimPrefix = "groovy-Tutorials at Blogdemo"
    String actual = trimPrefix - regex
    def expected = "Tutorials at Blogdemo"
    assertEquals("Tutorials at Blogdemo", actual)
}

上述正则表达式的不区分大小写版本:

def regex = ~"^([Gg])roovy-"

插入符运算符 ^ 将确保指定的子字符串在开头存在。

3.1. *replaceFirst()*方法

使用正则表达式和原生字符串方法,我们可以执行非常强大的技巧。*replaceFirst()*方法就是这些方法之一。它替换与给定正则表达式匹配的第一个匹配项。

让我们使用*replaceFirst()*方法删除前缀:

@Test
public void whenPrefixIsRemovedUsingReplaceFirst_thenReturnTrue() {
    def regex = ~"^groovy"
    String trimPrefix = "groovyTutorials at Blogdemo's groovy page"
    String actual = trimPrefix.replaceFirst(regex, "")
    def expected = "Tutorials at Blogdemo's groovy page"
    assertEquals(expected, actual)
}

3.2. *replaceAll()*方法

就像*replaceFirst()*一样,*replaceAll()*也接受正则表达式并给出替换。它替换与给定条件匹配的每个子字符串。要删除前缀,我们也可以使用此方法。

让我们使用*replaceAll()*仅替换字符串开头的子字符串:

@Test
public void whenPrefixIsRemovedUsingReplaceAll_thenReturnTrue() {
    String trimPrefix = "groovyTutorials at Blogdemo groovy"
    String actual = trimPrefix.replaceAll(/^groovy/, "")
    def expected = "Tutorials at Blogdemo groovy"
    assertEquals(expected, actual)
}