This question already has answers here:
Removing repeated characters in String
(4 answers)
Closed 8 years ago.
Lets say I have a string:
tttteeeeeeessssssttttttt
Using the power of regex, how can that string be turned into:
test
At first look it seems easy to do, but the current code (not regex) I have for it is not behaving well and im pretty sure regex is the way to go.
You can use:
str = str.replaceAll("([A-Za-z])\\1+", "$1");
RegEx Demo
Use string.replaceAll function.
strng.replaceAll("(.)\\1+", "$1");
The above regex captures the first character in the sequence of same characters and matches all the following one or more characters (which must be same as the one inside the capturing group) . Replacing those characters with the character inside group index 1 will give you the desired output.
Example:
System.out.println("tttteeeeeeessssssttttttt".replaceAll("(.)\\1+","$1" ));
Output:
test
(.)(?=\1)
Try this.Replace by empty string.See demo.
https://regex101.com/r/tX2bH4/41
str = str.replaceAll("(.)(?=\\1)", "");
Related
This question already has answers here:
Difference between matches() and find() in Java Regex
(5 answers)
Closed 3 years ago.
I am using regex in java, and I cannot create a regex to match what I want it to. I want to match everything in a string that begins and ends with a character.
"cats-are-cute" should match and return cats-are-cute
!!!DOG-CAT!!! should match and return DOG-CAT
I am using https://regexr.com/ to test, and it says my regex should work
I'm not even sure how I should attempt to fix this. I've found out that it will quite if the very first character does not match (e.i it is a special character) but it will match if the entire string begins + ends with a matching character.
It will not match if a special character begins or ends the entire string
Here is my code:
Pattern pattern = Pattern.compile("([A-Za-z0-9].*[A-Za-z0-9])");
Matcher matcher = pattern.matcher(word);
if(matcher.matches())
{
System.out.println("Matches");
System.out.println(matcher.start());
System.out.println(matcher.end());
}
if I type
testing
it returns
Matches
0
7
Small question: why is it 7 and not 6?
just like it should
but if I do "testing" matcher.matches() is false.
I think it should output
Matches
1
7
but sadly it does not as matcher.matches() returns false.
I think my regex is working, because quite a few sites have said that my regex will match what I want it to.
Am I missing something with Matcher matches()? Does it not do what I think it does?
I just needed to use find instead of matches, as OH GOD SPIDERS suggested in this comment:
As the documentation of Matcher.matches states it Attempts to match the entire region against the pattern.. You need to use Matcher.find if you don't want your entire String to be matched.
This question already has answers here:
My regex is matching too much. How do I make it stop? [duplicate]
(5 answers)
Closed 4 years ago.
I want to replace &sp; in the string below with Z.
Input text : ABCD&sp;EF&p;GHIJ&bsp;KL
Output text : ABCDZEFZGHIZKL
Can anyone tell me how to replace the every instance of &\D+; using java regular expression?
I am using /(&\D+;)?/ but it doesn't work.
Use String#replaceAll.
You also should use the ? modificator to +:
String str = "ABCD&sp;EF&p;GHIJ&bsp;KL";
String regex = "&\\D+?;";
System.out.println (str.replaceAll(regex,"Z"));
This should work
Match the initial &, then all characters that are not the tailing ;, then that tailing ; like so: &[^;]+; If not matching numbers (as suggested by your example with \D) is a requirement, add the numbers to the negated character set: [^;0-9] To make it replace all occurrences, add the global flag g. The site regexr.com is a handy tool to create regexes.
Edit: Sorry, I initially read your question wrong.
This question already has answers here:
How to Split a mathematical expression on operators as delimiters, while keeping them in the result?
(5 answers)
Closed 4 years ago.
I want to split a mathematical function by the sign of the variables in it like this :
input--> x-5y+3z=10
output--> [x,-5y,+3z,=10]
this code does not work in the way i want :
String function = "x-5y+3z=10";
String split = function.split("=|-|\\+");
the output of the array is :
[x,5y,3z,10]
so what is the correct regex for this ?
The "problem" using split is that the delimiter used will be removed, because it'll takt the parts that are between this delimiter, you need a pattern that is non-capturing or with a simple lookahead : match something wich is before something else
The pattern (?=[-+=]) would work, it'll take the part that starts with a -+= symbol without removing it :
String function = "x-5y+3z=10";
String[] split = function.split("(?=[-+=])");
System.out.println(Arrays.toString(split)); //[x, -5y, +3z, =10]
Some doc on Lookahead
This question already has answers here:
Replace/remove String between two character [duplicate]
(3 answers)
Closed 7 years ago.
I am interested in using the String.replaceAll function that will allow me to remove a specific sequence of a String.
Does the functionality of String.replaceAll replace the first occurrence of the String sequence given to, well replace? My assumption is yes.
Going about replacing the particular sub-string, how would I replace the characters in the provided String?
String sentence = "#red##blue##green#Hello#reset#";
The substring that I want to be removed is from the # to the other #, in this case, while running String.replace
String.replaceAll("#**PATTERN HERE SO NAME WON"T MATTER**#", "");
EDIT
Seeing replace and replaceAll makes since between the two differences, being one using regex.
My concern is removing the first occurrence of the expression given, being the original string of
String sentence = "#red##blue##green#Hello#reset#";
Would have to be ran 4 times in order to have "Hello" as the remaining member of the String.
Example:
Run 1 - replaceFirstOccurence("#regex#", "");
System.out.println(sentence); --> "#blue##green#Hello#reset#"
Run 2 - replaceFirstOccurence("#regex#", "");
System.out.println(sentence); --> "#green#Hello#reset#"
Run 3 - replaceFirstOccurence("#regex#", "");
System.out.println(sentence); --> "Hello#reset#"
Run 4 - replaceFirstOccurence("#regex#", "");
System.out.println(sentence); --> "Hello"
use standart method of String replaceAll(String regularExpression, String replacement)
for example:
"#some chars#".replaceAll("#[^#]*#", "##");
Alright to answer this question is actually extremely simple but the regex was the hard part.
Thanks to #waxtah for the regex that answered this question.
Using String.replaceFirst("#[^#]*#", "");
I was able to achieve my goal. Thanks to everyone here.
This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
java String.replaceAll without regex
I have a string and I need to replace some parts of it.
The replacement text contains regex wild chars though. Example:
String target = "Something * to do in ('AAA', 'BBB')";
String replacement = "Hello";
String originalText = "ABCDEFHGIJKLMN" + target + "ABCDEFHGIJKLMN";
System.out.println(originalText.replaceAll(target, replacement));
I get:
ABCDEFHGIJKLMNSomething * to do in ('AAA', 'BBB')ABCDEFHGIJKLMN
Why doesn't the replacement occur?
Because *, ( and ) are all meta-characters in regular expressions. Hence all of them need to be escaped. It looks like Java has a convenient method for this:
java.util.regex.Pattern.quote(target)
However, the better option might be, to just not use the regex-using replaceAll function but simply replace. Then you do not need to escape anything.
String.replaceAll() takes a regular expression and so it's trying to expand these metacharacters.
One approach is to escape these chars (e.g. \*).
Another would be to do the replacement yourself by using String.indexOf() and finding the start of the contained string. indexOf() doesn't take a regexp but rather a normal string.