RegEx за заместване на текст между два хеш-символа, между два тагова, но запазване на всичко останало

Така че трябва да заменя #var# и #var2# с <cfqueryparam value="#var#" /> и <cfqueryparam value="#var2#" />. Това обаче трябва да се случи само когато #var# е обвит в <cfquery></cfquery>.

Като допълнителен критерий cfquery-tag ще съдържа текст преди и след хеш-символите. Това е пример:

<cfquery datasource="#tablename#">
   SELECT * FROM table WHERE name = #var#, somethingelse = #var2#;
</cfquery>

Имам нужда от регулярен израз, който съвпада само с 'test', когато е между два хеш-символа и вътре в cfquery-tag, който може или не може да има атрибути.

Използвам grepWin, за да направя замяната.


person Torbjørn Angeltveit    schedule 28.05.2015    source източник
comment
Използвайте XML анализатор, за да анализирате вашия XML. След това използвайте регулярен израз, за ​​да обработите обикновеното съдържание на маркера.   -  person Sergey Kalinichenko    schedule 28.05.2015
comment
За примера, който показахте, вероятно ще има единични кавички около променливата. Вероятно имате други запитвания, където няма да има. Вие също не правите нищо относно типовете данни или нулевите атрибути. Освен това е възможно променливите в заявките да се използват по начин, при който параметрите на заявките са неподходящи. Като се имат предвид всички неща, това изглежда като лош план.   -  person Dan Bracuk    schedule 28.05.2015
comment
Ще го разгледам, благодаря! Имам около 1000 файла, за които да направя това. Някакви програми идват на ум, които ще извършват анализ на XML и regex-процес в подпапки?   -  person Torbjørn Angeltveit    schedule 28.05.2015


Отговори (2)


Друго решение с регулярен израз:

Можете да използвате следното за съответствие:

(#[^#><]*#)(?=[^>]*<\/cfquery>)

И замени с:

<cfqueryparam value="$1" />

Вижте ДЕМО

person karthik manchala    schedule 28.05.2015
comment
Това е хубаво! Точно по същество и отговаря на това, което попитах. Благодаря ти! - person Torbjørn Angeltveit; 28.05.2015
comment
Много хубаво решение, както добавихте демонстрация! +1 - person ShellFish; 28.05.2015
comment
Радвам се, че мислиш така.. :) - person karthik manchala; 28.05.2015

Стратегия

Можете да използвате awk, достатъчно е просто. В псевдокод ще опитаме следното:

look for occurrence of cfquery
substitute as desired
until /cfquery is found

Скрипт

Това води до следния скрипт:

in_query {
    $0 = gensub(/(#[^#]+#)/, "<cfqueryparam value=\"\\1\" />", "g", $0)
}
/<cfquery.*>/ {
    in_query = 1
}
/<\/ *cfquery.*>/ {
    in_query = ""
}
{
    print $0
}

Използване

awk -f script.awk file
person ShellFish    schedule 28.05.2015
comment
За мен е удоволствие, awk е мощен инструмент! - person ShellFish; 28.05.2015