简体   繁体   中英

Remove all punctuation from the end of a string

Examples :

// A B C.       -> A B C
// !A B C!      -> !A B C
// A? B?? C???  -> A? B?? C

Here's what I have so far:

while (endsWithRegex(word, "\\p{P}")) {
    word = word.substring(0, word.length() - 1);
}

public static boolean endsWithRegex(String word, String regex) {
    return word != null && !word.isEmpty() && 
        word.substring(word.length() - 1).replaceAll(regex, "").isEmpty();
}

This current solution works, but since it's already calling String.replaceAll within endsWithRegex , we should be able to do something like this:

word = word.replaceAll(/* regex */, "");

Any advice?

I suggest using

\s*\p{Punct}+\s*$

It will match optional whitespace and punctuation at the end of the string.

If you do not care about the whitespace, just use \\p{Punct}+$ .

Do not forget that in Java strings, backslashes should be doubled to denote literal backslashes (that must be used as regex escape symbols).

Java demo

String word = "!Words word! ";
word = word.replaceAll("\\s*\\p{Punct}+\\s*$", "");
System.out.println(word); // => !Words word

You can use:

str = str.replaceFirst("\\p{P}+$", "");

To include space also:

str = str.replaceFirst("[\\p{Space}\\p{P}]+$", "")

how about this, if you can take a minor hit in efficiency.

  1. reverse the input string

  2. keep removing characters until you hit an alphabet

  3. reverse the string and return

I have modified the logic of your method

public static boolean endsWithRegex(String word, String regex) {

        return word != null && !word.isEmpty() && word.matches(regex);
}

and your regex is : regex = ".*[^a-zA-Z]$";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM