Il semble que ma question soit vraiment simple et probablement dupliquée, mais je ne trouve pas de réponse.
Voici ma chaîne:
String age = 30; String height = 190; String weight = 80;
Je dois placez-le dans un champ différent 30, 190 et 80. L'âge peut être 9, la taille 99 et le poids 101 donc la méthode doit être flexible.
String s = "Bob age 30 height 190 and weight 80";
Comment puis-je l'extraire?
Je dois le faire dans Telend Open Studio et je n'ai pas la possibilité de l'initialiser et de le mettre dans un tableau puis récupérez-le et mettez-le dans la chaîne. Je veux mettre 30 dans le champ âge et faire de même avec la taille et le poids.
5 Réponses :
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Solution {
public static void main(String[] args) {
String test="Bob age 30 height 190 and weight 80";
String number = test.substring(test.lastIndexOf("age") + 3,test.lastIndexOf("age") + 6);
System.out.print(number);
number = test.substring(test.lastIndexOf("height") + 6,test.lastIndexOf("height") + 10);
System.out.print(number);
number = test.substring(test.lastIndexOf("weight") + 6,test.lastIndexOf("weight") + 9);
System.out.print(number);
Pattern p = Pattern.compile("-?\\d+");
test = "Bob age 30 height 190 and weight 80";
Matcher m = p.matcher(test);
System.out.println("\n");
while (m.find()) {
System.out.print(" "+m.group());
}
}
}
Il pourrait y avoir un meilleur moyen que la manipulation de chaînes pour ce faire.
Mais si vous souhaitez utiliser la manipulation de chaînes, vous pouvez utiliser une méthode qui recherche les mots clés spécifiques et obtient l'emplacement dans le sting (méthode String indexOf (age) ), puis récupérer la chaîne directement après ce mot-clé (en en ajoutant un à l'emplacement que vous venez d'obtenir) UNIQUEMENT s'il trouve cette sous-chaîne (s'il ne la trouve pas, il n'essaiera pas de récupérer le chiffre).
Vous devez également changer les variables de hauteur et de poids en double et lorsque vous extrayez la valeur de la chaîne, utilisez Double.parseDouble (numToParse).
essayez celui-ci:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
Pattern pattern = Pattern.compile("-?\\d+");
String s = "Bob age 30 height 190 and weight 80";
Matcher matcher = p.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group());
}
vous pouvez ajouter un résultat à une liste au lieu de faire Sysout.
Si vous voulez accepter les nombres flottants, optez pour \\ d + ([.] \\ d +)? regex
String example="Bob age 30 height 190 and weight 80";
Pattern pattern = Pattern.compile(".*age\\s(\\d+\\.\\d+|\\d+).*height\\s(\\d+\\.\\d+|\\d+).*weight\\s(\\d+\\.\\d+|\\d+)");
Matcher matcher = pattern.matcher(example);
while(matcher.find()) {
String age = matcher.group(1);
String height = matcher.group(2);
String weight = matcher.group(3);
}
.*one or more characters.
age is a static string.
\s means space
() means grouping match
\d only one digit and + means one or more digits if I write \d+ means more then one digit //eg 1,166,168 and some cases you want 80.5
so i added . and after . there should at least one or more digit so i added \d+.
| means or
\d+ only digit //e.g 80
Pouvez-vous m'expliquer ce qu'il y a à l'intérieur de la méthode compile ?
comment dois-je taper la méthode de compilation si je ne veux trouver que l'âge?
1. () donnez votre âge. 2. () vous donne de la taille et 3. () vous donne du poids. vous pouvez obtenir matcher.group (identifiant de groupe). L'identifiant du groupe est donné en fonction de ().
J'ai une erreur de suivi: séquence d'échappement non valide (les valides sont \ b \ t \ n \ f \ r \ "\ '\\) en utilisant la méthode dans votre message principal
quelle langue utilisez-vous?
Tout d'abord, vous pouvez remplacer tous les mots alpha dans un espace, puis le diviser par espace, puis prendre une liste et la stocker en utilisant du code en dur. Comme suit:
String age = 30; String height = 190; String weight = 80;
Sortie
public static void main( String[] args )
{
String line = "Bob age 30 height 190 and weight 80";
String numbersLine = line.replaceAll("[^0-9]+", " ");
String[] strArray = numbersLine.split(" ");
List<String> list = new ArrayList<>();
int index = 0;
for (String string : strArray) {
if (!string.equals("")) {
if( index == 0){
list.add("String age = "+Integer.parseInt(string) + ";");
}
else if( index == 1){
list.add("String height = "+Integer.parseInt(string) + ";");
}else{
list.add("String weight = "+Integer.parseInt(string) + ";");
}
index++;
}
}
for( String str : list)
{
System.out.println( str );
}
}
Vous souhaitez donc extraire uniquement les chiffres d'une chaîne?
Le chiffre viendrait-il toujours directement après le mot qui le décrit?
Les chaînes «âge», «hauteur» et «poids» sont-elles toujours présentes avant les nombres? Sont-ils la condition stricte pour faire correspondre ces valeurs? J'imagine qu'ils pourraient être dans un ordre aléatoire.
Oui, mais je dois le mettre dans différents champs et il pourrait y avoir des nombres avec une précision comme 80,5
Il est possible que je n'ai pas du tout ces champs. Mais si je l'ai, ça ressemble toujours à ça.
Copie possible de Comment extraire nombres d'une chaîne et obtenir un tableau d'entiers?
Créez 3 Patterns dont chacun correspond à [ _ ] avec le préfixe étant soit l'âge, la taille, soit le poids @Asier Aranbarri edit: ... et divise la chaîne résultante dans l'espace blanc
ce serait un mélange de trois indexOf ("age"), ("height"), ... et une analyse entière des lignes conséquentes (si elles existent, et vérifier si ce sont des nombres)
Vous devez donc extraire uniquement des nombres également les champs (comme l'âge, la taille, le poids)?
@soorapadman Je veux extraire 30 et le mettre dans le champ age et faire de même avec d'autres