2016-02-07 1 views
1

[version de regex - ICU via TextSoap 8 pour Mac par Unmarked Software]REGEX: s d {3,4} b n n?

Dans l'exemple ci-dessous, je dois saisir une ligne de texte comme celui-ci:

Today's XXXX ZZZZZZZ ###/# 

Some paragraph of Txt......???? 

Ainsi, le XXXX et ZZZZZZZ sont les mots, et les #### sont des nombres. Notez qu'il y a deux lignes, une nouvelle ligne après la ligne "todays ..." et ensuite une ligne vide. Et puis un paragraphe de texte. C'est en fait le paragraphe de texte qui m'intéresse. Je veux configurer mon REGEX pour faire 2 choses. L'un consiste à capturer les chiffres, ce qui est ce qu'il fait maintenant ... parfaitement. La deuxième chose est de capturer le texte après pour justifier le texte. Cependant, je ne peux pas comprendre ce que je dois faire pour arriver au dernier \ n où le "???" sont dans le texte ci-dessus.

Des suggestions?

Voici un exemple de chaîne ....

https://regex101.com/r/cN3kZ7/3

+0

Ce que vous décrivez est pas ce que vous montrez. Vous montrez "Aujourd'hui ...", puis aucune ligne vide, puis le texte du paragraphe. Alors, qu'est-ce que vous avez vraiment besoin de faire correspondre? Toute ligne qui commence par "Aujourd'hui" et se termine par "numéro de numéro de numéro de barre oblique"? Quant aux suggestions: debuggex.com et rege101.com sont votre meilleur ami, vous devriez être capable de trouver la réponse tout seul avec eux. –

+0

Quel est le point de ne pas fournir de chaînes d'entrée de la vie réelle ??? – Jan

+0

Vous devriez juste utiliser votre regex parfaite et ensuite faire correspondre (. *) Derrière pour le reste. – migg

Répondre

3

Quelque chose comme ce qui suit?

(?:^Today)\D*(?<numbers>\d+)(?:.*\R){2}(?<text>.*) 
# look for Today at the beginning of the string/line in multiline mode 
# match any non-digits 
# capture numbers into the group "numbers" 
# match .*\R two times - this is two lines including the newline character 
# capture the text into the group "text" 

Voir a demo on regex101.com. De toute évidence, vous pourriez aussi bien laisser la partie du numéro et du texte (et utiliser en conséquence $1 et $2):

(?:^Today)\D*(\d+)(?:.*\R){2}(.*) 

Cela permettra de saisir du texte dans le groupe $2.
Si vous voulez tous le texte (y compris d'autres lignes), vous aurez besoin des modificateurs de ligne (dans ce cas (?s) et (?s-)), un quantificateur paresseux et un mot d'arrêt:

(?:^Today)\D*(\d+)(?:.*\R){2}(?s)(.*?(?=stop))(?s-) 
# the same as above 
# turn on single-line mode (?s) - the dot matches newline characters as well 
# capture everything lazily (!) until 
# the positive lookahead finds "stop" literally 
# turn off the single line mode afterwards - (?s-) 

Voir un exemple pour this approach here.

EDIT: En fin de compte, nous avons utilisé l'expression rationnelle suivante (voir commentaires ci-dessous):

^\h+\D+(\d+)(?:.*\R){2}(.+) 
+0

Donc, pour être clair, (?:^Aujourd'hui) \ D * (\ d +) (?:. * \ R) {2} (? S) (. *? (? = Stop)) (? S-) va tout attraper jusqu'à ce qu'il frappe le mot " ARRÊTEZ" ? C'est génial. Cependant, chaque paragraphe n'a pas d'arrêt, sauf peut-être un \ r ou \ n. Donc, l'arrêt dans ce cas serait (?:^Aujourd'hui) \ D * (\ d +) (?:. * \ R) {2} (? S) (. *? (? = \ N)) (? S -) ???? – MagicMiles

+0

@MagicMiles: [No] (https://regex101.com/r/aB0fU9/4) - fournissez des chaînes d'entrée de la vie réelle (modifiez votre question initiale) et voyons si nous pouvons trouver une solution. – Jan

+0

De plus, celui-ci s'arrête avant ** stop ** ou à une ligne vide: https://regex101.com/r/aB0fU9/5 – Jan

0

On dirait que vous avez juste besoin d'activer un tag sur plusieurs lignes.

/\s\d{3,4}\b\n.*\?{3}/gm 

Regexer example. Vous aurez probablement envie de mettre des groupes de capture autour des décimales et le texte, comme ceci:

/\s(\d{3,4})\b\n(.*)\?{3}/gm 
0

Quelque chose comme ^Today\'s\s.+\s(\d+)\/(\d).*\n(.*)