2017-01-26 7 views
2

У меня есть следующие строки, более или менее:захвата конца строки строки, но избежать захвата совпадающих конечных символов

$strings = [ 
    "Concepto de la transferencia Un concepto uno  ", 
    "Concepto traspaso Orden #121231", 
    "Concepto trasnferencia  121231 Magical Concept  ", 
] 

и имеет следующее регулярное выражение:

|Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)$| 

Что хорошо фиксирует КОНЕЦ часть каждой из этих строк:

"Un concepto uno  " 
    "Orden #121231" 
    "121231 Magical Concept  " 

(включая запасные части). Но мне хотелось бы, чтобы матч исключал конечные пробелы, если они существуют. Результирующий в:

"Un concepto uno" 
    "Orden #121231" 
    "121231 Magical Concept" 

Я пробовал:

Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)(?>\s+)?$ 

или

Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)\s*$ 

Но ни работать, очевидно. Невозможно создавать встроенные модификаторы. (U) работа для concepto группа.

И я знаю, что я не могу получить trim в результате матча и сделать это. Просто хочу, чтобы это регулярное выражение работало. :)

ответ

5

Ну, повернуть последний .+ в .+? (используйте ленивый квантор) и добавить \s* до того $:

Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+?)\s*$ 
                   ^^^^ 

Смотрите regex demo

Если группа "Concepto" может быть пустым, замените .+? с .*?. Поскольку *?/+? ленивы, то \s* будет протестирован против первого, и, следовательно, все конечные символы пробелов будут находиться за пределами «концептуальной» группы.

Кроме того, атомные группы ((?>)) здесь могут быть заменены на простые группы, не захватывающие ((?:)).

+0

Чем быстрее вы отвечаете, тем глупее я чувствую. : P Спасибо большое :) – yivi