2010-05-02 3 views
0

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

я) (XYZ XZZ XVZ XWZ)

Clue: Начальная строка X и Z окончание строки одинаков для всех пар. Только средняя строка отличается YZV W.

Моей проба: [regexp {^X([Y|Z|V|W]*)Z$}]

Я хочу написать еще одно регулярное выражение, которое улавливает/соответствует только следующей строке, где приходит

II) (XYZ)

Моя пробная версия: [regexp {^X([Y]*)Z$}] или просто regexp {^XYZ$}

Просто хочу убедиться, что это правильный подход. Есть ли другой способ доступен для оптимизации регулярных выражений :)

I) 1-й проверялось

set to_Match_Str "XYZ XZZ XVZ XWZ" 
    foreach {wholeStr to_Match_Str} [regexp -all -inline {X[YZVW]Z} $to_Match_Str] { 

    puts "MATCH $to_Match_Str in the list" 
    } 

Он печатает только XZZ XWZ из списка. Его листья отсутствуют XYZ & XVZ Когда я включаю paranthesis [regexp -all -inline {X ([YZVW]) Z} $ to_Match_Str]. Он печатает все средние символы правильно YZVW

ответ

0

Мой испытание: [регулярное выражение {^ X ([Y | Z | V | W] *) Z $}]

Это будет соответствовать строки из , но поскольку вы используете множитель *, он также будет соответствовать строкам типа «XZ», «XYYYYYYYYYYYYYYYYZ» и «XYZYVWZWWWZVYYWZ». Для того, чтобы соответствовать среднему символ только один раз, не используйте множитель:

^X([Y|Z|V|W])Z$ 

Мой испытание: [регулярное выражение {^ X ([Y] *) Z $}]

То же там, он также будет соответствовать строкам типа «XZ», «XYYZ» и «XYYYYYYYYYYYYYYYYZ». Не ставьте множитель после набора:

^X([Y])Z$ 

или просто регулярное выражение {^ XYZ $}

Это ничего не поймаешь. Для того, чтобы это сделать то же самое, как и другие (поймать символ Y), вам нужны круглые скобки:

^X(Y)Z$ 
3

я) (XYZ XZZ XVZ XWZ)

Clue: Начальная строка является X и Z окончание строка одинаково для всех пар. Только средняя строка отличается Y Z V W.

Моя проба: [regexp {^X([Y|Z|V|W]*)Z$}]

Предполагая, что вы не после того, как буквальную скобки вокруг всей партии, вы подходите, что с помощью этого:

regexp {X([YZVW])Z} $string -> matchedSubstr 

Это потому, что внутренние струны всех одиночных символов. (Он также сохраняет согласованную подстроку в переменной matchedSubstr, выберите любое имя переменной там, которое вы хотите.) Вы не должны использовать | внутри [] в регулярном выражении, так как здесь нет особого значения. (Вы, возможно, потребуется добавить ^$ якоря вокруг внешней стороны.)

С другой стороны, если вы хотите, чтобы соответствовать несколько последовательностей символов (который Y и т.д. просто дублеров для), то вы используете этот:

regexp {X(Y|Z|V|W)Z} $string -> matchedSubstr 

Обратите внимание, что |является используется здесь, но []это не.

Если ваша реальная строка имеет многие из этих строк (в зависимости от того модель вы используете, чтобы соответствовать их), то самый простой способ извлечь их все с -all -inline опциям regexp, обычно используемых в foreach, как это:

foreach {wholeStr matchedSubstr} [regexp -all -inline {X([YZVW])Z} $string] { 
    puts "Hey! I found a $matchSubstr in there!" 
} 

Смешать и по вкусу.

Моя проба: [regexp {^X([Y]*)Z$}] или просто регулярное выражение {^XYZ$}

Просто хочу, чтобы убедиться, что его правильный подход. Есть ли другой способ для оптимизации regexp :)

Это оптимально для точного сравнения. И на самом деле Tcl оптимизирует это внутреннее значение для теста равенства прямых строк, если это буквально.

+1

ну, он не становится более авторитетным, чем ответ от члена основной команды Tcl. Приветствия. :) –

+0

Единственный сложный вопрос в этом вопросе заключался в том, чтобы выяснить, что именно было задано. (Как обычно, тех, кто умеет задавать вопросы, обычно не нужно спрашивать в первую очередь. Поэтому я предпочитаю попытаться помочь людям задавать более качественные вопросы. :-)) –

+0

@ Протестирован первый 1-й вопрос установлен to_Match_Str " XYZ XZZ XVZ XWZ» Еогеасп {wholeStr to_Match_Str} [регулярное_выражение -все -inline {X [YZVW] Z} $ to_Match_Str] { ставит "MATCH $ to_Match_Str в списке" } Он печатает только XZZ XWZ из списка , Его исключает XYZ & XVZ Когда я включаю paranthesis [regexp -all -inline {X ([YZVW]) Z} $ to_Match_Str]. Он правильно печатает все средние символы. Y Z V W – user330727

0

Вы можете использовать инструмент Visual Regexp, чтобы помочь, он обеспечивает обратную связь при построении регулярного выражения.

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