2012-01-27 7 views
-1

У меня есть входной строки, как показано нижеРегулярное выражение для строки замены

("abc xyz" OR "def") AND (ghi OR jkl) AND ("mno poe" OR stu)

я хочу, чтобы заменить

(myfun("abc xyz") OR myfun("def")) AND (myfun(ghi) OR myfun(jkl)) AND (myfun("mno poe") OR myfun(stu))

я хочу, чтобы строка с в двойной кавычки или одно слово замените на myfun(<string matched>)

Может ли любой орган помочь мне, как я могу установить это с помощью regul ar выражение? Благодаря Meghana

+0

Спасибо всем за ответы .. все рабочие .. но я могу сделать только 1 как ответ ... но раз спасибо все для ваших входов :) :) – meghana

ответ

1
List<string> reservedWords = new List<string>() { "AND","OR","NEAR","NOT" }; 
var rep = Regex.Replace(
      inputString, 
      @"([\""][\w ]+[\""])|(\w+)", 
      m=> reservedWords.Contains(m.Value) ? m.Value : "myfun(" + m.Value + ")" 
     ); 
+0

привет .. он выглядит идеально, спасибо за ответ :). Я собираюсь попробовать это :) – meghana

4

Следующая C# цитируемый выражение соответствует кавычки строки и слова, которые не являются AND или OR:

@"(""(?:[^\\""]+|\\.)*""|\b(?!(?:AND|OR)\b)\w+\b)" 

Замените его:

"myfun($1)" 

Если в верхнем регистре слова являются операторами, вы можете использовать это выражение вместо:

@"(""(?:[^\\""]+|\\.)*""|\b(?![A-Z]+\b)\w+\b)" 

Обновлено для удовлетворения новых требований OPS выражение будет выглядеть так:

@"(?i)(""(?:[^\\""]+|\\.)*""|\b(?!(?:and|or|not|near)\b)\w+\b)" 

Добавлен (?i), чтобы сделать его чувствительно к регистру и завершил список операторов лексем.

+0

Привет, Спасибо за ваш ответ ... но мои логические операторы могут быть И, НЕ, ИЛИ, НИКОГДА ... .etc. также если они указаны в двойной кавычке, тогда я хочу, чтобы они также заменили .... как мы можем указать в этом регулярном exp? – meghana

+0

Все ли заглавные слова зарезервированы? В этом случае вам не нужно их перечислять. Вышеприведенное выражение будет соответствовать цитируемому, не имеет значения, каков его контент. Обновленный ответ для вас. – Qtax

+0

hi Qtax ... Операторы и моя строка могут быть в любом случае (нижнем или верхнем). – meghana

1
[Test] 
    public void Test2() 
    { 
     string input = "(\"abc xyz\" OR \"def\") AND (ghi OR jkl) AND (\"mno poe\" OR stu)"; 
     string expected = "(myfun(\"abc xyz\") OR myfun(\"def\")) AND (myfun(ghi) OR myfun(jkl)) AND (myfun(\"mno poe\") OR myfun(stu))"; 
     string actual = Regex.Replace(input, @"([\""\']).*?(\1)|\b(?!AND|OR)\w+\b", ReplaceWord); 
     Assert.AreEqual(expected, actual); 
    } 

    private static string ReplaceWord(Match m) 
    { 
     return string.Format("myfun({0})", m.Value); 
    } 
+0

привет .. это выглядит тем, что мне нужно ... я обязательно попробую это. Спасибо :) – meghana

+0

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

2

Заменить

(".+?"|\b\w+?\b)(?<!(OR|AND)) 

с

myfun($1) 
+0

привет спасибо за ответ .. я уверен, попробуй это и вернись к u :) :) :) – meghana

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