在Java中修剪字符串的可能前缀

bar*_*nos 34 java regex string

我有String str,我想从中提取不包含可能前缀的子字符串"abc".

首先想到的解决方案是:

if (str.startsWith("abc"))
    return str.substring("abc".length());
return str;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 是否有一种"更清洁"的方式来使用它split"abc" 前缀的正则表达式?

  2. 如果是,它的效率是否低于上述方法(因为它在整个字符串中搜索)?

  3. 如果是的话,有没有更好的方法("更好的方式"=清洁和有效的解决方案)?

请注意,"abc"前缀可能出现在字符串的其他位置,不应删除.

谢谢

anu*_*ava 40

这行代码比上面的代码短:

return str.replaceFirst("^abc", "");
Run Code Online (Sandbox Code Playgroud)

但就性能而言,我猜两个代码之间不会有任何实质性差异.一个使用正则表达式,一个不使用正则表达式,但搜索和子串.

  • 如果由于存在锚`^`而字符串不以`abc`开头,它将立即停止 (6认同)

mse*_*ach 11

一个无正则表达式的解决方案(我需要这个,因为我要删除的字符串是可配置的并且包含反斜杠,需要转义才能在正则表达式中进行文字使用):

Apache Commons Lang将从开始处StringUtils.removeStart(str, remove)删除using和。removestrString.startsWithString.substring

该方法的源代码内容丰富:

public static String removeStart(final String str, final String remove) {
    if (isEmpty(str) || isEmpty(remove)) {
        return str;
    }
    if (str.startsWith(remove)){
        return str.substring(remove.length());
    }
    return str;
}
Run Code Online (Sandbox Code Playgroud)


fal*_*tru 6

使用String.replaceFirstwith ^abc(匹配前导abc)

"abcdef".replaceFirst("^abc", "")     // => "def"
"123456".replaceFirst("^abc", "")     // => "123456"
"123abc456".replaceFirst("^abc", "")  // => "123abc456"
Run Code Online (Sandbox Code Playgroud)