Regex Group Capture, как остановиться перед следующим словом - PullRequest
0 голосов
/ 25 мая 2018

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

Defaults(.*)Class=\"(?<class>.*)\"(.*)StorePath=\"(?<storePath>.*)\"

И следующая строка:

Defaults Class="Class name here" StorePath="Any store path here" SqlTable="SqlTableName"

Я пытаюсь добиться следующего:

class Class name here
storePath Any store path here

Но в результате я получаю:

class Class name here
storePath Any store path here SqlTable="SqlTableName"

Как остановиться перед текстом Sqltable?

Язык - C #, а механизм регулярных выражений - встроенный для.NET Framework.

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

В группе storePath вы подходите ноль или более раз любому символу (жадное совпадение).Что означает жадное совпадение, так это то, что оно возвращает столько символов, сколько возможно, поэтому оно сохраняет совпадающие символы до тех пор, пока не будет достигнуто последнее вхождение ".

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

Просто замените ваше регулярное выражение на:

Defaults(.*)Class=\"(?<class>.*)\"(.*)StorePath=\"(?<storePath>.*?)\"

Ссылки:

0 голосов
/ 25 мая 2018

Легче читать:

Class="(.+?)".+?StorePath="(.+?)"

. +?говорит, что матч не жадный, в основном соответствует как можно меньше.Это заставит его захватывать до следующего "

0 голосов
/ 25 мая 2018

Решение, предложенное @ ahmed-abdelhameed, решает проблему, я забыл не-жадного.

Defaults(.*)Class=\"(?<class>.*)\"(.*)StorePath=\"(?<storePath>.*?)\"

Спасибо!

...