Visual Studio Regex '?' - PullRequest
       5

Visual Studio Regex '?'

5 голосов
/ 26 июня 2009

MSVS: где регулярное выражение ?

У меня есть код, который я пытаюсь сопоставить с регулярным выражением в MSVS 2008, но я не могу найти регулярное выражение для него. Возьмите классический пример:

colou?r

... это регулярное выражение, которое соответствует color или colour. Это не соответствует ни в MSVS. Ссылаясь на файл справки, я не могу найти ?.

Это не будет иметь большого значения - его можно эмулировать чередованием:

colo(u|)r

Однако я получаю "Сгруппированное выражение отсутствует") ". ... что это ... нет. Как ни странно, MSVS имеет эти альтернативные группы (я не совсем уверен, почему ...) с фигурными скобками:

colo{u|}r

Что дает мне совершенно другую ошибку «Синтаксическая ошибка в шаблоне» ... которую я не вижу. В основном, как мне сделать ?? Мой фактический ввод не такой простой, как цвет / цвет, иначе я бы просто подделал его с помощью (color|colour). Полагаю, это может подделать, но это тупой способ.


Давайте попробуем чередование ...

Хорошо, я все еще не могу этого сделать, даже с чередованием. У меня есть два следующих регулярных выражения:

^[A-Z]+\t[0-9]+\t[^\t]+

^[A-Z]+\t[0-9]+\t[^\t]+\t[^\t]+

Эти два соответствуют двум наборам строк, которые по отдельности соответствуют моему тексту. (Первая соответствует части строк, соответствующей второй.)

Мой ввод - строки информации о валюте:

BZD 084 Belize dollar
CAD 124 Canadian dollar
CDF 976 Franc Congolais
CHE 947 WIR euro    (complementary currency)
CHF 756 Swiss franc
CHW 948 WIR franc   (complementary currency)
CLF 990 Unidad de Fomento   (funds code)

(Например, есть вкладки между евро WIR и (дополнительная валюта), но они не всегда есть.)

По логике, из этого следует, что для объединения

^[A-Z]+\t[0-9]+\t[^\t]+

^[A-Z]+\t[0-9]+\t[^\t]+\t[^\t]+

.. вы получаете ... ^ [A-Z] + \ т [0-9] + \ т ([^ \ т] + | [^ \ т] + \ т [^ \ т] +) ... который как-то эквивалентен второму выражению в первом наборе.

Ответы [ 5 ]

4 голосов
/ 26 июня 2009

Наш собственный Джефф Этвуд писал об этом некоторое время назад. По сути, реализация regex в Visual Studio довольно нестандартна, и нет простого способа сделать то, что обычно делают с ?. Вам придется использовать ваше {colour|color} выражение.

1 голос
/ 27 июня 2009

Хотя это не задокументировано, я обнаружил, что строка "()" будет соответствовать пустой строке. Например:

colo(u|())r

Аналогично, попробуйте

^[A-Z]+\t[0-9]+\t{[^\t]+(\t+[^\t]+|())}

В этом последнем случае не забудьте поставить альтернативу пустой строки последней, чтобы избежать частичного совпадения, или обязательно добавьте маркер конца строки '$'.

0 голосов
/ 27 июня 2009

Вы пробовали использовать самый длинный общий путь справа?

Например, для цвета и цвета это будет:

colo(ur|r)

и для ваших 2 регулярных выражений это будет:

^[A-Z]+\t[0-9]+\t{[^\t]+|[^\t]+\t[^\t]+}
0 голосов
/ 27 июня 2009

Это работает:

colo(u)|()r

для вашего реального примера, это будет соответствовать каждой строке:

^[A-Z]+:b[0-9]+:b[^\t]+(\t[^\t]+)|()
0 голосов
/ 27 июня 2009

Регулярные выражения в Visual Studio find не поддерживают? См. ссылку на MSDN. Лучше всего ставить чередование символов

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