Java: match regex and replace each character

I have a string, for example:

There exists a word *random*.

Random will be a random word How to replace each random character * with a regular expression and get the following results:

There exists a word ********.

So * replaces each character, in this case 6 characters Please note that I only change random words later, not the surrounding * So far, I have:

str.replaceAll("(\\*)[^.]*(\\*)","\\*");

But it replaces * random * with * instead of the required ******* (8 in total) I really appreciate any help

Solution

If you have only one word: –

In the current example, if you have only one such word, you can protect yourself from regular expressions by using some string class methods: –

String str = "There exists a word *random*.";

int index1 = str.indexOf("*");
int index2 = str.indexOf("*",index1 + 1);

int length = index2 - index1 - 1;   // Get length of `random`

StringBuilder builder = new StringBuilder();

// Append part till start of "random"
builder.append(str.substring(0,index1 + 1));

// Append * of length "random".length()
for (int i = 0; i < length; i++) {
    builder.append("*");
}

// Append part after "random"
builder.append(str.substring(index2));

str = builder.toString();

If you can have such multiple words: –

To this end, this is a regular expression solution (which is where it starts to get a little complicated): –

String str = "There exists a word *random*.";
str = str.replaceAll("(?<! ).(?!([^*]*[*][^*]*[*])*[^*]*$)","*");
System.out.println(str);

The above pattern replaces all characters that do not follow a string containing an even number * with * until the end

Whatever suits you, you can use it

I'll add an explanation of the above regular expression: –

(?<! )       // Not preceded by a space - To avoid replacing first `*`
.            // Match any character
(?!          // Not Followed by (Following pattern matches any string containing even number of stars. Hence negative look-ahead
    [^*]*    // 0 or more Non-Star character
    [*]      // A single `star`
    [^*]*    // 0 or more Non-star character
    [*]      // A single `star`
)*           // 0 or more repetition of the prevIoUs pattern.
[^*]*$      // 0 or more non-star character till the end.

Now the above pattern matches only those words in a pair of stars As long as you don't have any unbalanced stars

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>