2016-01-04 3 views
1

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

Может кто-то, пожалуйста, помогите мне понять, где мои мысли идут не так?

Вот проблема, которую я имею в решении, мое регулярное выражение, и что происходит не так:

проблему решить

Я дал ряд строк, представляющих собой папки, например:

"TopLevelFolder" 
"TopLevelFolder\Parent" 
"TopLevelFolder\Parent\Child" 

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

"TopLevelFolder" 
"...\Parent" 
"...\...\Child" 

Мои Regex

Двигатель: Dot Net

Язык: C#

(([^\\]+\\)+) 

regex101 пример:

https://regex101.com/r/zY1oM5/1

Это регулярное выражение пытается: один или больше раз, найти один или несколько символов, которые не являются обратным слэшем, а затем обратная косая черта и помещают это совпадение в группу захвата.

Например, в «TopLevel \ Parent \ Child» поместите каждый из «TopLevel» и «Parent» в группу захвата.

Что происходит неправильно

Возвращенных группы захвата для этого регулярного выражения в данном примере включает в себя:

"TopLevel\Parent\" 
"Parent\" 

Я считаю, что первая группа не должна быть захваченной, потому что я попросил, чтобы символы перед окончательная обратная косая черта не включает обратную косую черту.

Очевидно, что мои ожидания и понимание ошибочны. Что я должен делать здесь, и как мое понимание ошибочно?

+0

Вы также можете указать язык программирования, который будет использоваться, на всякий случай – Amir

ответ

1

Кажется, что вы хотите lazy match. Удалите внешнюю группу захвата, а затем добавьте квантор ? в конце выражения, так что + больше не greedy. Это позволит захватить каждую подстроку, как ожидалось.

/([^\\]+\\)+?/g 

вход TopLevel\Parent\Child вернется:

TopLevel\ 
Parent\ 

Updated Example


Затем вы можете заменить /([^\\]+\\)+?/g с ..\\.

Ввод TopLevelFolder\Parent\Child будет выводить: ..\..\Child.

Аналогичным образом, TopLevelFolder\Parent будет выводить ..\Parent.

+0

Фантастический, спасибо большое! Оказывается, мне также не хватает необходимого глобального модификатора, который вы добавили. Очень признателен :) –

Смежные вопросы