2017-05-15 4 views
0

Ich versuche, einen regulären Ausdruck für eine Zeile zu schreiben wie:Wie kann ich eine Gruppe von Zahlen, die in einer Zeile vorkommen können oder nicht, in einer Gruppe erfassen?

Funds Disb ABC Corp nmnxcb /abdsd= 12345678912345 abcdef 

und die Ziffern in einer benannten Gruppe abzurufen. Ich habe einen regulären Ausdruck für die oben erstellt als:

^Funds Disb ABC Corp.*\s+(?<SOMEID>\d+).*$ 

Das Problem mit, dass es würde meine Linie nicht überein, wenn die Zahl (12345678912345 in dem obigen Beispiel) nicht in der Leitung ist. Ich habe versucht, es zu ändern (Hinzufügen von "?" Nach der Gruppe), so würde es 0 oder 1 Instanz der benannten Gruppe erwarten, aber nach der Änderung hört es auf, die Zahl insgesamt als die benannte Gruppe zu lesen.

^Funds Disb ABC Corp.*\s+(?<SOMEID>\d+)?.*$ 

Antwort

2

Das Problem mit ^Funds Disb ABC Corp.*\s+(?<SOMEID>\d+)?.*$ ist, dass die erste .* den gesamten Rest der Zeile zunächst essen, alle Ziffern einschließlich. Es wird ein wenig zurückgehen müssen, um die \s+ zu befriedigen, aber es wird nicht genug zurückverfolgt, um die Ziffern zu finden - schließlich hast du es gesagt, dass die Ziffern völlig optional waren.

Um dies zu beheben, müssen Sie sicherstellen, dass die Regex niemals über Ziffern vor der eigentlichen Gruppe springt, in der sie übereinstimmen sollen: [^\d]* statt .*. Versuchen Sie also: ^Funds Disb ABC Corp[^\d]*\s+(?<SOMEID>\d+)?.*$

Verwandte Themen