Flex (regex fine) - сопоставление строк, начинающихся и заканчивающихся одним и тем же символом - PullRequest
1 голос
/ 28 октября 2009

(я избегаю всех своих цитат, которые могут затруднить чтение)

Мне нужно сопоставить строку, начинающуюся и заканчивающуюся одним и тем же символом в flex ... Я знаю длинный путь (RE - \ "a [^ (a \")] a \ "| \" b [^ (b \ ") b \" | и т.д ...), но я уверен, что это не то, что я должен делать (завтра в середине!);

Мне нужно сделать это в flex, но если вы можете придумать для него короткое регулярное выражение, возможно, я смогу преобразовать его в нотацию flex.

То, о чем я думал, было чем-то вроде -

%%
int firstChar;
%x string;
%%
\"[A-Za-z] { firstChar = yytext+1; /* to get first character,
                                      for people unfamiliar
                                      with c pointers */
    BEGIN(string);}
<string>[^((firstChar)\")] {}
<string>[(firstChar)\"] { BEGIN(INITIAL); }

(плохо знаком с флексом, возможно, неправильная запись)

Но это меня несколько беспокоит, во-первых, наличие этой переменной делает этот язык не обычным; во-вторых, я не знаю, можно ли вообще использовать переменную to в сопоставлении с образцом; и в-третьих, я не знаю, как НЕ соответствовать этому, если это просто обычная строка. И в-третьих, я не знаю, как вернуть все, что было найдено в «строке»

Спасибо за вашу помощь!

Ответы [ 2 ]

7 голосов
/ 28 октября 2009

Использовать обратная ссылка . \1 до \9 относятся к первым девяти группам, захваченным регулярным выражением с использованием скобок ().

var regex:RegExp = /\b([a-zA-Z])\w+\1\b/g;
var test:String = "some text that starts and ends with same letter";
var result:Object;
while(result = regex.exec(test))
    trace(result[0]);

следы

текст
что
начинается

Регекс объяснил:

\b          //word boundary
([a-zA-Z])  //capture the first character
\w+         //one or more characters (use * to capture two letter words)
\1          //the first character
\b          //word boundary

g           /*
              make the regex global. Without this, the program will will 
              print the first match ('text') in an infinite loop
            */
0 голосов
/ 28 октября 2009

(я избегаю всех своих цитат, которые могут затруднить чтение)

Мне нужно сопоставить строку, которая начинается и заканчивается одним и тем же символом в flex ...

Попробуйте что-то вроде этого:

^(?s)(.).*\1$

Что, кажется, работает для регулярного выражения Flex в соответствии с этим тестером регулярных выражений Flex со строкой

she sells seashells 
by the seashores

(начинается и заканчивается s и содержит разрыв строки)

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