user2303325
user2303325

Reputation: 786

Extracting a word containing a symbol from a string in Java

The basic idea is that I want to pull out any part of the string with the form "text1.text2". Some examples of the input and output of what I'd like to do would be:

"employee.first_name" ==> "employee.first_name"
"2 * employee.salary AS double_salary" ==> "employee.salary"

Thus far I have just .split(" ") and then found what I needed and .split("."). Is there any cleaner way?

Upvotes: 0

Views: 132

Answers (4)

Zeinab Abbasimazar
Zeinab Abbasimazar

Reputation: 10439

I'm not an expert in JAVA, but as I used regex in python and based on internet tutorials, I offer you to use r'(\S*)\.(\S*)' as the pattern. I tried it in python and it worked well in your example.

But if you want to use multiple dots continuously, it has a bug. I mean if you are trying to match something like first.second.third, this pattern identifies ('first.second', 'third') as the matched group and I think it relates to the best match strategy.

Upvotes: 0

Piyush
Piyush

Reputation: 2050

String mydata = "2 * employee.salary AS double_salary";
pattern = Pattern.compile("(\\w+\\.\\w+)");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
  System.out.println(matcher.group(1));
}

Upvotes: 0

Mena
Mena

Reputation: 48404

I would go with an actual Pattern and an iterative find, instead of splitting the String.

For instance:

String test = "employee.first_name 2 * ... employee.salary AS double_salary blabla e.s blablabla";
// searching for a number of word characters or puctuation, followed by dot, 
// followed by a number of word characters or punctuation
// note also we're avoiding the "..." pitfall
Pattern p = Pattern.compile("[\\w\\p{Punct}&&[^\\.]]+\\.[\\w\\p{Punct}&&[^\\.]]+");
Matcher m = p.matcher(test);
while (m.find()) {
    System.out.println(m.group());
}

Output:

employee.first_name
employee.salary
e.s

Note: to simplify the Pattern you could only list the allowed punctuation forming your "."-separated words in the categories

For instance:

Pattern p = Pattern.compile("[\\w_]+\\.[\\w_]+");

This way, foo.bar*2 would be matched as foo.bar

Upvotes: 2

Juned Ahsan
Juned Ahsan

Reputation: 68715

You need to make use of split to break the string into fragments.Then search for . in each of those fragments using contains method, to get the desired fragments:

Here you go:

public static void main(String args[]) {
    String str = "2 * employee.salary AS double_salary";
    String arr[] = str.split("\\s");
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].contains(".")) {
            System.out.println(arr[i]);
        }
    }
}

Upvotes: 1

Related Questions