Reguliere expressies gebruiken om een ​​waarde in Java te extraheren

Ik heb verschillende strings in de ruwe vorm:

[some text] [some number] [some more text]

Ik wil de tekst in [een getal] extraheren met behulp van de Java Regex-klassen.

Ik weet ongeveer welke reguliere expressie ik wil gebruiken (hoewel alle suggesties welkom zijn). Waar ik echt in geïnteresseerd ben, zijn de Java-aanroepen om de regex-string te nemen en deze op de brongegevens te gebruiken om de waarde van [een getal] te produceren.

EDIT: ik moet hieraan toevoegen dat ik alleen geïnteresseerd ben in een enkel [een nummer] (in feite de eerste instantie). De bronreeksen zijn kort en ik ga niet zoeken naar meerdere keren dat [een getal] voorkomt.


Antwoord 1, autoriteit 100%

Volledig voorbeeld:

private static final Pattern p = Pattern.compile("^([a-zA-Z]+)([0-9]+)(.*)");
public static void main(String[] args) {
    // create matcher for pattern p and given string
    Matcher m = p.matcher("Testing123Testing");
    // if an occurrence if a pattern was found in a given string...
    if (m.find()) {
        // ...then you can use group() methods.
        System.out.println(m.group(0)); // whole matched expression
        System.out.println(m.group(1)); // first expression from round brackets (Testing)
        System.out.println(m.group(2)); // second one (123)
        System.out.println(m.group(3)); // third one (Testing)
    }
}

Omdat u op zoek bent naar het eerste nummer, kunt u een dergelijke regexp gebruiken:

^\D+(\d+).*

en m.group(1)zullen u het eerste nummer teruggeven. Merk op dat getekende nummers een minteken kunnen bevatten:

^\D+(-?\d+).*

Antwoord 2, autoriteit 14%

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regex1 {
    public static void main(String[]args) {
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher("hello1234goodboy789very2345");
        while(m.find()) {
            System.out.println(m.group());
        }
    }
}

Uitvoer:

1234
789
2345

Antwoord 3, autoriteit 10%

Allain heeft in principe de Java-code, dus die kun je gebruiken. Zijn uitdrukking komt echter alleen overeen met alsuw cijfers alleen worden voorafgegaan door een stroom woordtekens.

"(\\d+)"

zou de eerste reeks cijfers moeten kunnen vinden. U hoeft niet op te geven wat ervoor staat, als u zeker weet dat dit de eerste reeks cijfers zal zijn. Evenzo heeft het geen zin om te specificeren wat erna komt, tenzij je dat wilt. Als u alleen het nummer wilt en zeker weet dat dit de eerste reeks van een of meer cijfers zal zijn, dan is dat alles wat u nodig heeft.

Als je verwacht dat het wordt gecompenseerd door spaties, zal het nog duidelijker worden om op te geven

"\\s+(\\d+)\\s+"

misschien beter.

Als je alle drie de onderdelen nodig hebt, is dit voldoende:

"(\\D+)(\\d+)(.*)"

BEWERKENDe uitdrukkingen van Allain en Jack suggereren dat je een subset van niet-cijfers moet specificeren om cijfersvast te leggen. Als je de regex-engine vertelt dat je op zoek bent naar \d, dan negeert het alles vóór de cijfers. Als de uitdrukking van J of A pastbij je patroon, dan is de hele overeenkomst gelijk aande invoertekenreeks. En er is geen reden om het te specificeren. Het vertraagt ​​waarschijnlijk een schone wedstrijd, als het niet volledig wordt genegeerd.


Antwoord 4, autoriteit 3%

In aanvulling op Patroon, de Java Stringklasse heeft ook verschillende methoden die kunnen werken met reguliere expressies, in jouw geval zal de code zijn:

"ab123abc".replaceFirst("\\D*(\\d*).*", "$1")

waarbij \\Deen niet-cijferig teken is.


Antwoord 5, autoriteit 3%

In Java 1.4 en hoger:

String input = "...";
Matcher matcher = Pattern.compile("[^0-9]+([0-9]+)[^0-9]+").matcher(input);
if (matcher.find()) {
    String someNumberStr = matcher.group(1);
    // if you need this to be an int:
    int someNumberInt = Integer.parseInt(someNumberStr);
}

Antwoord 6, autoriteit 3%

Deze functie verzamelt alle overeenkomende reeksen uit string. In dit voorbeeld zijn alle e-mailadressen uit string nodig.

static final String EMAIL_PATTERN = "[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
        + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})";
public List<String> getAllEmails(String message) {      
    List<String> result = null;
    Matcher matcher = Pattern.compile(EMAIL_PATTERN).matcher(message);
    if (matcher.find()) {
        result = new ArrayList<String>();
        result.add(matcher.group());
        while (matcher.find()) {
            result.add(matcher.group());
        }
    }
    return result;
}

Voor message = "[email protected], <[email protected]>>>> [email protected]"zal het een Lijst met 3 elementen maken.


Antwoord 7

Probeer zoiets als dit te doen:

Pattern p = Pattern.compile("^.+(\\d+).+");
Matcher m = p.matcher("Testing123Testing");
if (m.find()) {
    System.out.println(m.group(1));
}

Antwoord 8

Eenvoudige oplossing

// Regexplanation:
// ^       beginning of line
// \\D+    1+ non-digit characters
// (\\d+)  1+ digit characters in a capture group
// .*      0+ any character
String regexStr = "^\\D+(\\d+).*";
// Compile the regex String into a Pattern
Pattern p = Pattern.compile(regexStr);
// Create a matcher with the input String
Matcher m = p.matcher(inputStr);
// If we find a match
if (m.find()) {
    // Get the String from the first capture group
    String someDigits = m.group(1);
    // ...do something with someDigits
}

Oplossing in een Util Class

public class MyUtil {
    private static Pattern pattern = Pattern.compile("^\\D+(\\d+).*");
    private static Matcher matcher = pattern.matcher("");
    // Assumptions: inputStr is a non-null String
    public static String extractFirstNumber(String inputStr){
        // Reset the matcher with a new input String
        matcher.reset(inputStr);
        // Check if there's a match
        if(matcher.find()){
            // Return the number (in the first capture group)
            return matcher.group(1);
        }else{
            // Return some default value, if there is no match
            return null;
        }
    }
}
...
// Use the util function and print out the result
String firstNum = MyUtil.extractFirstNumber("Testing4234Things");
System.out.println(firstNum);

Antwoord 9

Kijk, je kunt het doen met StringTokenizer

String str = "as:"+123+"as:"+234+"as:"+345;
StringTokenizer st = new StringTokenizer(str,"as:");
while(st.hasMoreTokens())
{
  String k = st.nextToken();    // you will get first numeric data i.e 123
  int kk = Integer.parseInt(k);
  System.out.println("k string token in integer        " + kk);
  String k1 = st.nextToken();   //  you will get second numeric data i.e 234
  int kk1 = Integer.parseInt(k1);
  System.out.println("new string k1 token in integer   :" + kk1);
  String k2 = st.nextToken();   //  you will get third numeric data i.e 345
  int kk2 = Integer.parseInt(k2);
  System.out.println("k2 string token is in integer   : " + kk2);
}

Aangezien we deze numerieke gegevens in drie verschillende variabelen opnemen, kunnen we deze gegevens overal in de code gebruiken (voor verder gebruik)


Antwoord 10

Hoe zit het met [^\\d]*([0-9]+[\\s]*[.,]{0,1}[\\s]*[0-9]*).*Ik denk dat het voor getallen met een gebroken deel zou zorgen.
Ik heb spaties toegevoegd en ,als mogelijk scheidingsteken toegevoegd.
Ik probeer de cijfers uit een string te halen, inclusief floats en houd er rekening mee dat de gebruiker een fout kan maken en spaties kan opnemen tijdens het typen van het nummer.


Antwoord 11

Soms kun je een eenvoudige .split(“REGEXP”) methode gebruiken die beschikbaar is in java.lang.String. Bijvoorbeeld:

String input = "first,second,third";
//To retrieve 'first' 
input.split(",")[0] 
//second
input.split(",")[1]
//third
input.split(",")[2]

Antwoord 12

als u uit een bestand leest, kan dit u helpen

             try{
             InputStream inputStream = (InputStream) mnpMainBean.getUploadedBulk().getInputStream();
             BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
             String line;
             //Ref:03
             while ((line = br.readLine()) != null) {
                if (line.matches("[A-Z],\\d,(\\d*,){2}(\\s*\\d*\\|\\d*:)+")) {
                     String[] splitRecord = line.split(",");
                     //do something
                 }
                 else{
                     br.close();
                     //error
                     return;
                 }
             }
                br.close();
             }
         }
         catch (IOException  ioExpception){
             logger.logDebug("Exception " + ioExpception.getStackTrace());
         }

Antwoord 13

Pattern p = Pattern.compile("(\\D+)(\\d+)(.*)");
Matcher m = p.matcher("this is your number:1234 thank you");
if (m.find()) {
    String someNumberStr = m.group(2);
    int someNumberInt = Integer.parseInt(someNumberStr);
}

Other episodes