I am having a problem tring to split a sting based on parentheses.
I have a String like this
Fe(C5H5)2FeO3 and I need to split the sting in to an array so the array reads
Fe
(C5H5)2
FeO3
Im an using this code.
String form = "Fe(C5H5)2FeO3";
from.split([()]+);
I am having trouble getting the characther after the ")" to split out.
This also has to work for multiple sets of () in the same string.
Thanks
positive look ahead and look behind can do some of this:
String formula = "Fe(C5H5)2FeO3";
String regex = "(?=\\()|(?<=\\)\\d)";
String[] tokens = formula.split(regex );
System.out.println(Arrays.toString(tokens));
For more on this, check out the regular expressions tutorial
You can use a simple regex to match parts of the sequence instead of splitting on a regex:
import java.util.*;
import java.util.regex.*;
import java.lang.*;
class Main {
public static void main (String[] args) throws java.lang.Exception
{
String formula = "Fe(C5H5)2FeO3";
Pattern p = Pattern.compile("[^(]+|[(][^)]*[)]\\d+");
Matcher m = p.matcher(formula);
while (m.find()) {
System.out.println(m.group());
}
}
}
This program produces the output below:
Fe
(C5H5)2
FeO3
Related
I need to extract the text between the last brackets of a string. This is how it looks like:
String text= "[text1][text2][text3][text4]";
I need to get
String result = "text4"
I have tried with Regex but i can't manage to make it work. I would appreciate some help with getting the regex and the substring. Thank you very much
Use the regex, .+(\[.+\])$ and capture group(1).
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String text = "[text1][text2][text3][text4]";
Matcher matcher = Pattern.compile(".+(\\[.+\\])$").matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}
Output:
[text4]
Explanation of the regex at regex101:
You don't need regex. You can use lastIndexOf
String text= "[text1][text2][text3][text4]";
System.out.println(text.substring(text.lastIndexOf("[")+1, text.lastIndexOf("]")));
I have a list that contains some tags:
[[food_1]], [[drink_2]], [[food_1]]
I want to retrieve all tags that match an input
example:
input: [[food_*]]
result:[[food_1]], [[food_2]]
input and tags have always the same format
this is my code snippet
Matcher m = Pattern.compile(input.replace("*","\\d")).matcher(element from tags list)
while(m.find()){
...
}
if you are using collections, you can start to use streams, check this construction :
yourList
.stream()
.filter(line -> line.matches("YOUR REGEX"))
.collect(Collectors.toList());
You can not use the input as is: if your tag format is [[character_*]], then it is most likely that:
Pattern.compile(input.replace("*","\\d"))
Turns to:
Pattern.compile("[[character_*]]".replace("*","\\d"))
And
Pattern.compile("[[character_\\d]]"))
Since you can do a union of range, eg: [[a-z]&&[^b]], I think that pattern will only ever match one character at a time:
You can test that here, or from your code: https://www.regexplanet.com/share/index.html?share=yyyyd5puaar
It find 'd' for your example.
TL;DR: you must escape your pattern or fix it:
Pattern.compile(Pattern.quote("[[character_*]]").replace("*","\\E\\d\\Q")))
// turns to: \Q[[character_\E\d\Q]]\E
The \E and \Q are what Java uses in Pattern.quote to escape a regexp.
Square bracket [] is regex metacharacter, hence need to escape that.
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestRegex {
public static void main(String[] args) throws IOException {
String pattern = "(\\[\\[food_[*]]])";
pattern = pattern.replace("*", "\\d");
Matcher m = Pattern.compile(pattern).matcher(
"[[food_1]], [[drink_2]], [[food_3]]");
while (m.find()) {
System.out.println(m.group(1));
}
}
}
Output:
[[food_1]]
[[food_3]]
I am trying to find a match between commas if it contains a specific string.
so far i have ,(.*?myString.?*),
Obviously this finds all the input between the first comma in the entire input and the first comma after the string i want. How do i reference the comma immediately before the string that i want?
Edit: i also want to find the match that occurs after a specific set of characters
ie. occurs after (fooo)
dsfdsdafd,safdsa,gfdsgdtheMatchfdsgfd,dsafdsa,dsfoooafd,safdsa,gfhhhgdtheMatchfhhhfd,dsafdsa
returns gfhhhgdtheMatchfhhhfd, not gfdsgdtheMatchfdsgfd
The following regex should do it :
[^,]+theMatch.*?(?=,)
see regex demo / explanation
Java ( demo )
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class RegEx {
public static void main(String[] args) {
String s = "dsfdsdafd,safdsa,gfdsgdtheMatchfdsgfd,dsafdsa";
String r = "[^,]+theMatch.*?(?=,)";
Pattern p = Pattern.compile(r);
Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(m.group()); // gfdsgdtheMatchfdsgfd
}
}
}
Edit
use this regex fooo.*?([^,]+theMatch.*?)(?=,) demo
You are finding too much because .* will include the comma.
You need the following regular expression: ,([^,]*myinput[^,]*),
[^,]* basically says find all non-comma characters.
I would suggest the following code:
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String str = "dsfdsdafd,safdsa,myinput,dsafdsa";
Pattern p = Pattern.compile(",([^,]*myinput[^,]*),");
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println(m.group(0));
// prints out ",myinput,"
System.out.println(m.group(1));
// prints out "myinput"
}
}
}
Here is a StackOverflow question that is basically the same with some very good answers associated:
Regex to find internal match between two characters
For more on regular expressions in Java look here: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
If you want the position of the comma proceeding your input string use the following code:
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String str = "dsfdsdafd,safdsa,myinput,dsafdsa";
Pattern p = Pattern.compile(",([^,]*myinput[^,]*),");
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println(str.indexOf(m.group(0)));
// prints out "16"
}
}
}
By feeding the match of the regular expression into the String Method indexOf( you are able to locate the position of the start of your string.
Edit:
To find the occurrence of a string following another string, simply modify the regex to: fooo.*,([^,]*theMatch[^,]*),
fooo.* will greedily consume all characters between fooo and the start of your match.
Example code:
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
String str = "dsfdsdafd,safdsa,gfdsgdtheMatchfdsgfd,dsafdsa,dsfoooafd,safdsa,gfhhhgdtheMatchfhhhfd,dsafdsa";
Pattern p = Pattern.compile("fooo.*,([^,]*theMatch[^,]*),");
Matcher m = p.matcher(str);
if(m.find()) {
System.out.println(m.group(1));
// prints out: gfhhhgdtheMatchfhhhfd
}
}
}
The usual approach is to use a pattern that cannot match your delimiter in place of .. In this case, you need that only at the front of the pattern; you can use a reluctant quantifier at the back as you already do (though you've misspelled it). For example:
,([^,]*myString.*?),
I have the following gps position String
#114.034407,E,22.648272,N,0.00,0.00#010104#004500#17.034407,E,22.648272,N,0.00,0.00#010104#004500#5.034407,E,22.648272,N,0.00,0.00#010104#004500
and I want to part it the longitude position (#17.,#5.). All longitudes position starts with # and contains . point after the fitst or first and second or first, second and third. How can I get this result with regular expression?
Result:
#114.034407,E,22.648272,N,0.00,0.00#010104#004500
#17.034407,E,22.648272,N,0.00,0.00#010104#004500
#5.034407,E,22.648272,N,0.00,0.00#010104#004500
Code
Pattern pattern = Pattern.compile("regular expression");
Matcher matcher = pattern.matcher(gpsPacket);
matcher.matches();
You can use this regex:
(?=#\d{1,3}\.)
with this code:
import java.util.*;
import java.lang.*;
import java.io.*;
class YourClass
{
public static void main (String[] args) throws java.lang.Exception
{
String str = "#114.034407,E,22.648272,N,0.00,0.00#010104#004500#17.034407,E,22.648272,N,0.00,0.00#010104#004500#5.034407,E,22.648272,N,0.00,0.00#010104#004500";
String delimiters = "(?=#\\d{1,3}\\.)";
String[] coordinates = str.split(delimiters);
for(String coordinate : coordinates) {
System.out.println(coordinate);
}
}
}
It will split the string on a # followed by 1 to 3 number then a dot. Live demo
This is the regex based upon the information given.
It pulls the three data sets out of your input.
If there are more rules than what you have minimally specified you will have to make adjustments.
I suggest going to a website and practicing. There is a lot of helpful information here RegExr, along with the ability to practice live.
(#[\d]{1,3}.[\d]{6},E,[\d]{2}.[\d]{6},N,[\d]{1}.[\d]{2},[\d]{1}.[\d]{2}#[\d]{6}#[\d]{6})
I have a String like this..
I am a !!!guy!!! but I like !!!cats!!! better than dogs.
I need the strings within the exclamation Strings (!!!), a collection of Strings or array will do.
I can probably do this a dirty way with String's substring and indexOf, but if you can suggest a better way with regular expressions or just cleaner code that would be much appreciated.
Thanks.
You can use a simple regex like this:
!!!(.*?)!!!
And then grab the capturing group content
Working demo
Match information
MATCH 1
1. [10-13] `guy`
MATCH 2
1. [31-35] `cats`
You can use something like this java code:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches
{
public static void main( String args[] ){
// String to be scanned to find the pattern.
String line = "I am a !!!guy!!! but I like !!!cats!!! better than dogs.";
String pattern = "!!!(.*?)!!!";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
while (m.find( )) {
//--> If you want a array do the logic you want with m.group(1)
System.out.println("Found value: " + m.group(1) );
}
}
}