Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Find the first occurrence with Regex and Java

Tags:

java

regex

I would like to be able to find the first occurrence of m² and then numbers in front of it, could be integers or decimal numbers. E.g.

"some text" 38 m² "some text" ,

"some text" 48,8 m² "some text",

"some text" 48 m² "some text", etc..

What I have so far is:

\d\d,\d\s*(\m\u00B2)|\d\d\s*(\m\u00B2)

This right now finds all occurrences, although I guess it could be fixed with findFirst(). Any ideas how to improve the Regex part?

like image 710
Novice Avatar asked Mar 27 '16 07:03

Novice


People also ask

How to count occurrences of a given character using regex in Java?

Count occurrences of a given character using Regex in Java. Given a string and a character, the task is to make a function which counts the occurrence of the given character in the string using ReGex. Examples: Input: str = "geeksforgeeks", c = 'e' Output: 4 'e' appears four times in str.

How to find first character occur in a string in Java?

Enter String to Find First Char Occur = java Enter the Character to Find = a The First Character Occurrence of a at 1 position In Java Programming, there is a string function called indexOf. This indexOf function returns the index position of the first occurrence of a character in a string.

How to test regular expression in Java?

It is widely used to define the constraint on strings such as password and email validation. After learning Java regex tutorial, you will be able to test your regular expressions by the Java Regex Tester Tool.

What is Java regex?

Java Regex. The Java Regex or Regular Expression is an API to define a pattern for searching or manipulating strings. It is widely used to define the constraint on strings such as password and email validation. After learning Java regex tutorial, you will be able to test your regular expressions by the Java Regex Tester Tool.


2 Answers

To get the first match, you just need to use Matcher#find() inside an if block:

String rx = "\\d+(?:,\\d+)?\\s*m\\u00B2";
Pattern p = Pattern.compile(rx);
Matcher matcher = p.matcher("E.g. : 4668,68 m² some text, some text 48 m²  etc");
if (matcher.find()){
    System.out.println(matcher.group());
}

See IDEONE demo

Note that you can get rid of the alternation group using an optional non-capturing group (?:..)?

Pattern breakdown:

  • \d+ - 1+ digits
  • (?:,\d+)? - 0+ sequences of a comma followed with 1+ digits
  • \s* - 0+ whitespace symbols
  • m\u00B2 - m2.
like image 195
Wiktor Stribiżew Avatar answered Oct 12 '22 13:10

Wiktor Stribiżew


This is what I came up with you help :) (work in progress, later it should return BigDecimal value), for now it seems to work:

 public static String findArea(String description) {

        String tempString = "";
        Pattern p = Pattern.compile("\\d+(?:,\\d+)?\\s*m\\u00B2");

        Matcher m = p.matcher(description);

        if(m.find()) {
            tempString = m.group();
        }
//remove the m and /u00B2 to parse it to BigDecimal later
        tempString = tempString.replaceAll("[^0-9|,]","");
        System.out.println(tempString);
        return tempString;
    }
like image 29
Novice Avatar answered Oct 12 '22 14:10

Novice