2012-01-11 3 views
1

Окружающая среда: Visual Studio 2008 sp1regex match "target string"

Может кто-нибудь, пожалуйста, помогите мне со следующим Regex?

Я пытаюсь добраться до 'Целевая строка. Узор любая строка между [имя] =» '

/*Input String*/ 
SET [blah] = 'AE', [blah] = 'A1A', [number] = 004 WHERE [name]='target string' 


/*Current Regex*/ 
(?<=[?name]?=).*(?=\') 

/*Current Results*/ 
'AE', [blah] = 'A1A', [number] = 004 WHERE [name]='target string 

/*Desired Results*/ 
'target string 

ответ

1

Это делает это?

(?<=\[name]=).*?(?=') 

Или, если целевая строка должна быть возвращена без ведущего («):

(?<=\[name]=').*?(?=') 

Примечания: Я полагаю, что целевая строка не убежала апостроф (» ').


EDIT: Это делает трюк с уцелевшим апострофом:

(?<=\[name]=)(''|.)+?(?='([^']|$)) 

Он найдет "'John''s pub" в

SET [blah] = 'AE', [blah] = 'A1A', [number] = 004 WHERE [name]='John''s pub' 
+0

регулярного выражения Ор имел в квадратных скобках в качестве дополнительного, и Я уверен, что это было намеренно: это выглядит как фрагмент инструкции SQLServer 'UPDATE', где имена полей могут, но не нуждаются, не быть заключены в квадратные скобки. – ruakh

+0

Да,? сделало бы скобки дополнительными. –

+0

Не «сделал бы», «делает». (Я говорю, что я думаю, что ваше предложенное регулярное выражение неверно.) – ruakh

3

Вы должны избежать ваших квадратных скобок, иначе они будут неверно истолкованы как создание класса символов. То есть, вам нужно:

(?<=\[?name\]?=).*(?=\') 

Я также рекомендую изменения .* в более явном '[^']*, просто так вы не рискуете поймать что-нибудь после целевой строки; и Tim Pietzcker указывает (в недавно удаленном комментарии), что вы можете написать ' вместо \' (ближе к концу регулярного выражения); так:

(?<=\[?name\]?=)'[^']*(?=')