2017-07-02 1 views
2

que je fais un projet en utilisant MapReduce Amazon Web Services et je vais avoir cette erreur:Stackoverflow lorsque la chaîne spliting utilisant l'expression rationnelle

FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.StackOverflowError at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)

J'ai lu quelques autres questions pour comprendre pourquoi cela est arrivé et il semble mon regex a des chemins alternatifs répétitifs. Ceci est l'expression rationnelle:

\\s+(?=(?:(?<=[a-zA-Z])\"(?=[A-Za-z])|\"[^\"]*\"|[^\"])*$) 

Ce qu'il fait est qu'il divise par l'espace, sauf quand ils sont à l'intérieur de ces symboles < > ou ces " ". Donc, fondamentalement, prend des chaînes qui sont à l'intérieur de ces 2 types de symboles. J'ai essayé beaucoup d'autres versions mais aucune ne fonctionne, donc je suis loin d'une version optimale. Je suis un peu perdu et c'est la première fois que j'utilise ces regex complexes. Quelqu'un peut-il s'il vous plaît donner une meilleure option pour mon regex?

J'apprécierais vraiment tous les commentaires à ce sujet!

EDIT:
Cette chaîne avec des URL à l'intérieur <> et texte à l'intérieur "" et des espaces:
< \ janhaeussler.com/ sioc_type = user & sioc_id = 1 /> "HEY" < .org/1999/02/22-rdf-syntax-ns # Type />

devrait produire ces 3 chaînes:
1. < \ janhaeussler.com/ sioc_type = user & sioc_id = 1 /> (avec ou sans <>)
2. "HEY"
3. < .org/1999/02/22 rdf-syntax-ns # Type />

EDIT 2:
Je pense que les symboles <> sont source de confusion. J'essaie de trouver une regex qui se divise par un ou plusieurs espaces sans tenir compte des espaces à l'intérieur de "", puisque les URL n'ont pas d'espaces.

+1

vous devez fournir une entrée en forme et respectivement la sortie attendue. De cette façon, il serait mieux compréhensible et une solution alternative pourrait être fournie –

Répondre

1

Essayez ceci:

\s+(?=(?:(?:[^"]*"){2})*[^"]*$) 

Demo

String string = "abc d<\\janhaeussler.com/?sioc_type=user &sioc_id=1/> \"HEY 1\" 2 3 <.org/1999/02/22-rdf-syntax-ns#type/> \"tra la\" <asdfadsf sadfasdf/> 4 \"sdf sdf\" 5 6"; 
    String[] res=string.split("\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)"); 
    System.out.println(Arrays.toString(res)); 

sortie Will:

[abc, d<\janhaeussler.com/?sioc_type=user, &sioc_id=1/>, "HEY 1", 2, 3, <.org/1999/02/22-rdf-syntax-ns#type/>, "tra la", <asdfadsf, sadfasdf/>, 4, "sdf sdf", 5, 6] 
+0

Cela ne fonctionne pas dans mon exemple, bien que l'approche est ce que Im recherche. Dans ma sortie Im ayant des espaces et "String" n'est pas divisé. Dit plus simplement, j'ai besoin d'une regex qui se sépare ** par l'espace ** sauf pour les espaces à l'intérieur de "". – Angie94

+0

La regex mise à jour n'ignore pas les espaces à l'intérieur de "". Les chaînes sont divisées mot par mot. @ RizwanM.Tuman – Angie94

+0

@ Angie94 Je souhaite que votre exigence aurait beaucoup plus clair en premier lieu, plz essayer maintenant .. et laissez-moi savoir est ce que vous avez voulu –

0

Ne pas utiliser split(). Utilisez une place boucle find(), avec cette regex:

(?:<[^<]*> 
    | 
    "[^"]*" 
    | 
    \S 
    )+ 

Exemple:

String input = "<\\janhaeussler.com/?sioc_type=user&sioc_id=1/> \"HEY\" <.org/1999/02/22-rdf-syntax-ns#type/>"; 

Pattern p = Pattern.compile("(?:<[^<]*>|\"[^\"]*\"|\\S)+"); 
for (Matcher m = p.matcher(input); m.find();) { 
    System.out.println(m.group()); 
} 

Sortie

<\janhaeussler.com/?sioc_type=user&sioc_id=1/> 
"HEY" 
<.org/1999/02/22-rdf-syntax-ns#type/> 
+0

Cela fonctionne très bien, mais je veux utiliser split() pour certaines raisons. – Angie94

0

Vous pouvez essayer de faire correspondre: tags ou ce qui est entre les guillemets doubles OU les espaces non-blancs restants.

<[^>]+>|"[^"]+"|\S+ 

Par exemple:

String str = "<\\janhaeussler.com/?sioc_type=user&sioc_id=1/> \"HEY\" YOU! \"How Are You?\" <.org/1999/02/22-rdf-syntax-ns#type/>"; 

final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("<[^>]+>|\"[^\"]+\"|\\S+"); 
java.util.regex.Matcher matcher = pattern.matcher(str); 

while (matcher.find()) { 
    System.out.println("match: " + matcher.group(0)); 
} 

Prints:

match: <\janhaeussler.com/?sioc_type=user&sioc_id=1/> 
match: "HEY" 
match: YOU! 
match: "How Are You?" 
match: <.org/1999/02/22-rdf-syntax-ns#type/>