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 \\D
een 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);
}