Нужна помощь в написании регулярного выражения - TCL - PullRequest
0 голосов
/ 02 мая 2010

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

i) (XYZ XZZ XVZ XWZ)

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

Мое испытание: [regexp {^X([Y|Z|V|W]*)Z$}]

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

ii) (XYZ)

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

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

я) 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 Когда я включаю парантез [regexp -all -inline {X ([YZVW]) Z} $ to_Match_Str]. Он печатает все средние символы правильно Y Z V W

Ответы [ 3 ]

3 голосов
/ 02 мая 2010

i) (XYZ XZZ XVZ XWZ)

Подсказка: начальная строка 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$}

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

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

0 голосов
/ 02 мая 2010

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

0 голосов
/ 02 мая 2010

Мое испытание: [regexp {^ X ([Y | Z | V | W] *) Z $}]

Это будет соответствовать заданным строкам, но, поскольку вы используете множитель *, оно также будет соответствовать строкам, таким как "XZ", "XYYYYYYYYYYYYYYYYZ" и "XYZYVWZWWWZVYYWZ". Чтобы соответствовать среднему символу только один раз, не используйте множитель:

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

Мое испытание: [regexp {^ X ([Y] *) Z $}]

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

^X([Y])Z$

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

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

^X(Y)Z$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...