2015-12-17 3 views
0

путаю о Regex: ".*", если я применить это к этой фразе: we have a problem with "string one" and "string two". Please respond. он должен работать так:C# Regex вопрос определения

1) в первую очередь должны найти двойные кавычки в предложении

2) затем точка выберите каждый литерал (без разрыва строки) и звезду * повторите этот узор. так что результат должен быть такой:

"string one" and "string two". Please respond. 

я думаю .* закончить предложение, потому что он включает в себя все литералы без разрыва строки, так что вторая двойная цитата не может повлиять на приговор, потому что предложение было закончено .*, я думаю что я делаю ошибку, и я не понимал, как это работает! кто-нибудь может объяснить мне процедуру?

+0

* жадный и ест все между внешними кавычками. –

ответ

3

Вы получили это право. .* поднимается до конца строки или первой строки новой строки.

Тогда это будет backtrack.

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

Поэтому * будет «отказаться» один символ, и попытка соответствовать " будет снова на результирующую строку:

"string one" and "string two". Please respond 

Это терпит неудачу, поэтому * сдастся другой один и т.д.:

"string one" and "string two". Please respon 
"string one" and "string two". Please respo 
"string one" and "string two". Please resp 
"string one" and "string two". Please res 
... snip ... 
"string one" and "string two". P 
"string one" and "string two". 
"string one" and "string two" 
"string one" and "string two 

Aha, что подстрока сразу после ", так что потребляется, и матч преуспевает:

"string one" and "string two" 

Вы могли бы хотеть попробовать ungreedy версию: ".*?". В этом случае *? постарается сопоставить любой символ (.) как можно меньше времени для успешного матча.

Для достижения успеха вам все равно необходимо закрыть ", поэтому версия .*? будет пытаться использовать символы до тех пор, пока двигатель не сможет продолжить движение по шаблону. В результате вы получите:

"string one" 
+0

Хорошее объяснение. Когда я начинал изучать регулярные выражения, я застрял на отступлении и не мог понять, как это работает. –

+0

Действительно хорошее объяснение, спасибо +1 – pejman

1

У вас есть второй «в своем регулярном выражении, что является соответствие последним буквальным» Удалить это и просто использовать

".*