Regex добавить строку в часть матча

4358
arielnmz

Я считаю, что это довольно сложно сделать, дело в следующем:

У меня есть строка в виде:

GlobalParameters::$docId = DocList::$PARTNERS; 

И я хочу добавить строку _VIEW в конец символа. Проблема в том, что я хочу, чтобы не только соответствовал PARTNERS, но и любому другому символу, поэтому я попробовал это регулярное выражение:

Найти:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$(.*)\; 

Заменить:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$(.*)_VIEW\; 

Но я только что получил:

GlobalParameters::$docId = DocList::$(.*)_VIEW; 

На всех матчах. Как я могу обойти это?

1

2 ответа на вопрос

0
AFH

Главное неверно, что совпадающее поле разделено (и )должно быть идентифицировано \1в строке замены:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$\1_VIEW\; 

Также стоит отметить, что, хотя ваша реализация Geany не имеет этого значения по умолчанию, многие программы, которые используют регулярные выражения, по умолчанию используют режим BRE (Basic Regular Expression), который требует \(и \)разделяет подвыражение поиска, как в:

GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$\(.*\)\; 

Примечание: Geany от v1.24 не нуждается в круглые скобки, чтобы быть экранированы, так что вам нужно просто (и )разграничить соответствующие поля.

Мне встречаются другие, более простые строки поиска и замены, но я не уверен, что они могут быть удовлетворительными, не видя контекст других строк в файле. Тем не менее, следующее должно быть в порядке: -

Поиск:

\(GlobalParameters\:\:\$docId\ \=\ DocList\:\:\$.*\)\; 

Заменить:

\1_VIEW\; 

Здесь вся строка, кроме конечного ;, сопоставляется и _VIEWдобавляется.

Но почему нужно избегать скобок? Они не являются частью строки, которую мне нужно сопоставить, но в любом случае я собираюсь попробовать это решение, как только доберусь до своего компьютера. Спасибо. arielnmz 9 лет назад 0
По умолчанию для многих программ, использующих регулярные выражения, используется режим BRE (Basic Regular Expression), который требует экранирования. См. [Википедия] (http://en.wikipedia.org/wiki/Regular_expression). Когда я проверил твои струны с помощью `sed`, мне понадобились обратные слэши. AFH 9 лет назад 0
Я этого не знал, но, возможно, Джани не использует этот режим по умолчанию. arielnmz 9 лет назад 0
Я не знаю Geany, так что, возможно, вам не нужны обратные слэши, но вам обязательно нужно `\ 1` в потоке замены, чтобы расширить отмеченное подвыражение. Попробуйте сначала использовать это, а затем добавьте обратную скобку в скобки, если вам нужно. AFH 9 лет назад 0
Просто попробовал и работает как шарм! Спасибо! Я действительно не знал о системе grep для сопоставления полей, аккуратно. Еще раз спасибо arielnmz 9 лет назад 0
Вам нужны были обратные слеши с кронштейнами? Если вы этого не сделаете, я должен изменить свой ответ так, чтобы пропущенные обратные косые черты не классифицировались как одна из неправильных вещей. AFH 9 лет назад 0
Нет, мне вообще не пришлось выходить за скобки, возможно, это из-за того, как Geany вызывает grep (он использует ее в качестве внутренней команды сопоставления строк). arielnmz 9 лет назад 0
Я обновил свой ответ, чтобы удалить «неправильную» классификацию строки поиска, но я оставил эту информацию, чтобы помочь другим с связанной проблемой RE. AFH 9 лет назад 0
0
Sebastiano Pera

To extend AFH's answer, I made a more complex example:

To-be-modified string:

abc: 123 

Search:

(abc)\: (123) 

Replace (1def will be appended to the first match expression and 456 to the second):

\1def \2456 

Result:

abcdef 123456 

Похожие вопросы