2015-01-26 3 views
0

У меня возникли проблемы с поиском хорошего Regexp. я получил этот текст в качестве входных данных:Регулярное выражение с кавычками

settings= ShouldAppears1 
setting_ -> "ShouldAppears2" 
setting__ = 'ShouldAppears3' #ShouldNotAppear 
setting___ = "MissingEndQuote.ShouldNotAppears 

В результате я хотел бы получить массив:

[0] => settings=ShouldAppears1 
[1] => settings=ShouldAppears2 or [1] => settings="ShouldAppears2" 
[2] => settings=ShouldAppears3 or [2] => settings="ShouldAppears3" 

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

То, что я получил до сих пор это регулярное выражение:

(?i)([A-Z_]{3,}\s{0,1}[=><-]{1,2}\s{0,1}(['"]?).+?\2) 

Проблема заключается в том, что я получил этот результат:

0 => settings= A 
1 => 
2 => setting_ = "Appears" 
3 => " 
4 => setting__ = "Appears" 
5 => " 
6 => setting___ = " 
7 => 

Я хотел бы, чтобы не видеть линии 1,3,5,7 но я не могу сделать (? =) группу без захвата, но все же могу использовать обратную ссылку.

Спасибо за вашу помощь,

EDIT

я не могу изменить, как регулярное выражение называется в сценарии я могу работать только на Regexp. Результатом является только глобальный матч, а не глобальный полный матч. Если я немного изменить свой регулярному_выражению по:

(?i)(\w+\s*(?:=|->)\s*(?:("|')\w+\g{2}|\w+)) 

я

0 => settings= ShouldAppears1 
1 => setting_ -> "ShouldAppears2" 
2 => " 
3 => setting__ = 'ShouldAppears3' 
4 => ' 

Это почти идеальный, но есть способ, чтобы избавиться от [2] и [4]? Т.е. установить ("|") не учитываются, но все еще быть в состоянии поддержать ссылку на него

ответ

1

Если вы можете использовать обратную ссылку:

(?i)(\w+)\s*(?:=|->)\s*(("|')\w+\g{3}|\w+) 

Захват группы 0 соответствует паре весь ключ-значение?.
Захват группа 1 соответствует ключу.
Захват группы 2 соответствует значению.
Capturing Group 3 соответствует цитаты, двойные кавычки или ничего

+0

Спасибо за ответ. Я бы это иметь только группу 0. Я редактирую сообщение, чтобы сделать вас под лучше стоять – timmalos

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