2017-08-22 2 views
0

Il semble que cela devrait être simple, mais je n'ai pas été en mesure de trouver quelque chose en ligne pour vous aider. On me présente une description qui contient à la fois des lettres et des chiffres. Cependant, il y a une instance dans la description qui a à la fois des lettres et des nombres dans la chaîne, pas seulement l'un de l'autre. par exemple.Extrait chaîne alphanumérique en utilisant Regex

(machine virtuelle Java sur FAXAGT Heartbeat prod_faxagt_08 (ft2ua937) Port 39630 (WAS9)) -: Sitescope: JVM FAXAGT erreur sur Heartbeat prod_faxagt_08 (ft2ua937) Port 39630 (WAS9). L'état est incapable de se connecter au serveur. Chemin complet est FaxAgent

Je voudrais une expression regex qui va me donner:

ft2ua937

Une seule fois depuis que je sais qu'il apparaît deux fois dans la description. En termes plus simples, étant donné une expression similaire à ci-dessus, je veux une sortie qui a les deux lettres & numéros et aucun caractère spécial. Toute partie de la description qui n'a que des lettres ou seulement des chiffres doit être ignorée.

+3

* donné une expression similaire ci-dessus * - similaire comment? Quelles parties sont fixes et lesquelles sont variables? – shmosel

+0

Qu'avez-vous essayé jusqu'à présent? Vous pouvez l'utiliser pour tester votre regex https://regex101.com/ –

+0

Doit-il contenir uniquement des caractères hexadécimaux (donc 123xyz56 n'est pas autorisé)? Est-ce que la longueur est toujours 8? Pourquoi doit-il contenir * deux * lettres * et * nombres, parce que les deux '' 12345678 "' et '' abcdefa ''sont des nombres hexadécimaux valides? Le numéro hexadécimal est-il toujours entre parenthèses? – Bohemian

Répondre

0

J'ai voulu utiliser cette expression dans Tableau en utilisant la fonction regexp_extract. Pour mes fins, je crois avoir trouvé une expression qui fonctionne.

Il peut être un peu moche mais REGEXP_EXTRACT ([Description], '(\ w [az] {1,6} \ d {1,8} \ w {1,8} \ d \ w)' semble fonctionner comme j'en avais besoin.

0

correspondant à n'importe quel mot avec des lettres et des chiffres est une mauvaise façon d'aborder cela. Il semble que vous ayez besoin de parcourir certains journaux. Peut-être Splunk serait une bonne option si c'est quelque chose que vous devez faire face souvent.

En attendant, je vous recommande à comprendre le contexte de votre journal et de trouver directement ce que vous cherchez:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class StackOverflow45827050 { 
    private static final String EXAMPLE = "(FAXAGT JVM Heartbeat on prod_faxagt_08 (ft2ua937) Port 39630 (WAS9)) - : " + 
             "Sitescope: FAXAGT JVM Heartbeat on prod_faxagt_08 (ft2ua937) Port 39630 (WAS9) error. " + 
             "Status is unable to connect to server. Full path is FaxAgent"; 
    private static final Pattern JVM_HEARTBEAT_PATTERN = Pattern.compile(
     "\\((?<messageCode>.*) JVM Heartbeat on (?<hostName>.*) \\((?<importantCode>.*)\\) Port (?<port>\\d*).*"); 

    public static void main(final String... args) { 
    final Matcher matcher = JVM_HEARTBEAT_PATTERN.matcher(EXAMPLE); 
    if (!matcher.matches()) { 
     throw new IllegalArgumentException(); 
    } 
    System.out.println(matcher.group("importantCode")); 
    } 

} 

rendements:

ft2ua937