Вопрос по regex, c#, pattern-matching – Найдите шаблон, соответствующий «а», игнорируя тот «а», который лежит в пределах «б» и «с»

1

Need a compound expression for

" from" such that " from" is not within parenthesis

(игнорируя те, которые в скобках) здесьa=" from"; b="("; and c=")";

The closest (but invalid) pattern I could write is

string pat = @"^((?!\(.* from.*\)).)* from((?!\(.* from.*\)).)*$";

мое выражение отрицает, если таковые имеются & quot; от & Quot; присутствует в скобках, но я хочу строго игнорировать такие & quot; от & Quot;


Matches should be found in:

1: " from" 2:select field1 from t1 (select field1 from t1)   ---- 1 time in both
3: select field1 from t1 (select field1 from t1)select field1 from t1  ---2 times

Strings not containing matches:(Because i want to ignore the " from" within parenthesis)

1: select field1 no_f_rom_OutOf_Parenthesis t1 (select field1 from t1)
2: (select field1 from t1)  3: "" (Empty String) 4. No word as form
0 times in all four strings




Relevant Material: (не так много нужно читать)

Самая полезная ссылка ближе к моему вопросу о том, как соответствовать «шаблону» но не "обычный" Ответ от stanav был 31 июля 2009 г., 08:05 по следующей ссылке ...

http://www.vbforums.com/archive/index.php/t-578417.html

Также:Регулярное выражение в C #, которое содержит «this» но не "это"

Также:Регулярное выражение для соответствия строке, которая не содержит слова?

Я изучал / искал около недели, но все еще сложен для меня :)

Могут ли скобки быть вложенными? primfaktor
Да, даже они могут быть вложенными. Но я должен найти только это & quot; от & Quot; которого нет ни в одной скобке. Если это найдено. Выражение соответствует Sami
@HenkHolterman. Да, выражения варьируются Sami
Я не знаю, могут ли регулярные выражения .NET обрабатывать вложенные шаблоны, Perl может быть & # x201C; рекурсивным & # x201D; НАСКОЛЬКО МНЕ ИЗВЕСТНО. primfaktor
Для SQL вам нужен парсер. За "привет, братан!" Как дела & quot; Вы могли бы использовать регулярное выражение. Henk Holterman

Ваш Ответ

2   ответа
1

Это может быть то, что вы хотите.

string s="select field1 dfd t1 (select field1 from t1)select field1 from t1";
Regex r=new Regex(@"(?<=\)|^)\bselect\b.*?\bfrom\b.*?(?=\()",RegexOptions.RightToLeft);
r.Replace(s,"HELL yeah");
Это не с вложенными скобками.
Да, Анирудха. Вы решили мою проблему. Спасибо за это. Я использовал что-то подобное. Это решает мою текущую проблему. Но не решение заглавия, поскольку у меня могут быть критерии игнорирования, такие как «bb hj exp ab»; игнорировать любой опыт, окруженный «bb. * exp. * ab»; если я получу решение "а"; игнорирование 'a'; в 'b'. Это будет некоторая комбинация любых двух выражений и динамическая работа для новых ситуаций. В любом случае, вы решили мою проблему лучше, чем я, поэтому я голосую за вас. Большое спасибо. Любая дальнейшая помощь тоже приветствуется. Sami
2

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

if (Regex.IsMatch(subjectString, 
    @"\sfrom           # Match ' from'
    (?=                # only if the following regex can be matched here:
     (?:               # The following group, consisting of
      [^()]*           # any number of characters except parentheses,
      \(               # followed by an opening (
      (?>              # Now match...
       [^()]+          #  one or more characters except parentheses
      |                # or
       \( (?<DEPTH>)   #  a (, increasing the depth counter
      |                # or
       \) (?<-DEPTH>)  #  a ), decreasing the depth counter
      )*               # any number of times
      (?(DEPTH)(?!))   # until the depth counter is zero again,
      \)               # then match the closing )
     )*                # Repeat this any number of times.
     [^()]*            # Then match any number of characters except ()
     \z                # until the end of the string.
    )                  # End of lookahead.", 
    RegexOptions.IgnorePatternWhitespace))

Как регулярное выражение в одной строке («Ужас! Ужас!»), Если вы настаиваете:

if (Regex.IsMatch(subjectString,@"\sfrom(?=(?:[^()]*\((?>[^()]+|\((?<DEPTH>)|\)(?<-DEPTH>))*(?(DEPTH)(?!))\))*[^()]*\z)"))
строка q = & quot; выберите hi из t1 in (выберите hello из t2) & quot ;; If (Regex.IsMatch (q, @ & quot; \ sfrom (? (?: [^ ()] * ((? & Gt; [^ ()] + | ((? & Lt; DEPTH & gt;) |) (? & Lt; -DEPTH & gt;)) * (? (DEPTH) (?!)))) * [^ ()] * \ Z) & quot ;, RegexOptions.IgnorePatternWhitespace)) Ошибка: ошибка синтаксического анализа. Квантификатор {x, y} ничего не следует Sami
@SamiAkram: это переменная.\z более конкретно, чем$ (он действительно совпадает только в конце строки, а не перед любым закрывающим пробелом, поэтому я предпочитаю его вообще), но в этом случае вы также можете использовать$.
Что такое глубина? Я никогда не видел это раньше. Это особое слово или переменная? \ z следует заменить на $ в C #? Sami
@SamiAkram: Похоже, вы потеряли довольно много обратной косой черты при копировании регулярного выражения. Кроме того, ошибка не имеет большого смысла - нет{x,y} квантификатор в любом месте этого регулярного выражения.
! Пожалуйста, напишите внизу выражение в одной строке без комментариев, так как я могу исправить ошибку при ее перезаписи. Sami

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