2015-03-20 2 views
1

У меня есть файл plist, который имеет вложенные свойства. Мне нужно получить текст сразу после открытия "(", это имя ". Я могу сделать это хорошо. Однако, поскольку есть вложенные свойства, когда моя логика C# итерации по строкам в plist, имя получает переписывается следующим свойством есть ли способ, чтобы соответствовать только точную картину,. специально не соответствуют какой-либо части строки заканчивается с «)»Regex соответствует только строке, которая не заканчивается на ")"

: (MyNameHere    //Match 
      : (propertyone) // do not match, because it ends with ")" 

здесь является Regex, я использую, чтобы соответствовать имени ,

:\s\(([a-z,A-Z,0-9,-_]+) 

Я использую C# .NET 4.5

Благодаря

+0

Может ли это сделать с помощью цикла чтения строки и проверки, если линия EndsWith (")") вместо регулярного выражения? – Prescott

+0

Можете ли вы предоставить лучший пример: где не будут сняты требуемые поля? Пожалуйста, укажите, что именно должно быть захвачено и что не должно быть в вашем примере. – Sia

ответ

1

Вам нужно добавить положительное опережения утверждение на последнем, если вы не хотите какой-либо другой символ пробела следующий [\w-]+. (?=\s|$) положительный lookahead, который утверждает, что за совпадением должен следовать пробельный символ или конец привязки линии.

@":\s\(([\w-]+)(?=\s|$)" 

Использование \s при необходимости или иначе @":\s\(([\w-]+)$ будет достаточно.

DEMO

+0

спасибо Авинаш, вы можете объяснить, почему позитивный взгляд в будущее ищет пространство «\ s»? Я пробовал что-то подобное, но я искал «)». твой работал, и, очевидно, мой не сделал. просто интересно, почему .. – user2219930

+0

правильно, не удалось увидеть регулярное выражение op. –

+0

@ user2219930 Вы пытаетесь найти точное слово. Вместо добавления отрицательного lookahead (_not заканчивая ')' _) положительный lookahead, который проверяет следующий символ, должен быть '\ s' или' $ 'будет выполнять ожидаемую работу. –

3

Я не знаю, что вы точно пытается сделать, но я подозреваю, что балансировочные группы будут вам интересны: https://msdn.microsoft.com/en-us/library/bs2twtah%28v=vs.110%29.aspx

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

(?>[^\n)]*)(?!\)) 

детали:

(?>...) # is an atomic group that prevents the regex engine to backtrack 
(?!\)) # is a negative lookahead (not followed by ...) to check there 
     # is not parenthesis after 

Важно, чтобы * (как и все остальные кванторы) по умолчанию жадный.

About atomic groups

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

(?m)^.*(?<!\))$ 
+1

Ударь мне! +1 – hwnd

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