Лучшая практика: частичное сопоставление регулярных выражений - PullRequest
8 голосов
/ 11 января 2012

Я не уверен, что регулярные выражения - лучшее решение здесь, но они кажутся достаточно логичными;Я просто не уверен, как на самом деле реализовать это.

По сути, я хочу, чтобы мой пользователь мог вводить имя метода и анализировать его на предмет достоверности после каждого ввода символов.Я определил допустимый формат функции как регулярное выражение, и достаточно легко проверить, совпадают ли эти два.Проблема в том, что я хотел бы иметь возможность выполнить частичное совпадение, чтобы дать пользователю знать: «Пока это действительно».

Например,

+(NSString *)thisIsAValid:(ObjectiveC *)method;

является допустимым методом.Его можно сопоставить с простой строкой регулярных выражений, например

[\+-]\(w+\s*\*?\)\w+....etc...

.Но я хотел бы иметь возможность иметь ту же строку регулярного выражения "match"

+(NSStr

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

Q)(NStr

Есть ли способ реализовать что-то подобное с помощью стандартных функций регулярного выражения, или мне нужно было бы сделать что-то более радикальное?много!Вы, ребята, бесценны.


Поразмыслив, я думаю, я мог бы сделать свой вопрос более ясным (а также более лаконичным): Обычно для поиска шаблона используется регулярное выражениев тексте.То есть, сколько раз в этом абзаце появляется «кот» или «кроватка».Я хочу сделать обратное, искать строку "в" регулярном выражении.То есть, какая часть этой строки, начиная с начала, соответствует этому регулярному выражению.В конечном итоге я хотел бы вернуть индекс, по которому строка перестает соответствовать рассматриваемому регулярному выражению.

Ответы [ 2 ]

1 голос
/ 04 марта 2012

RegexKit швы для использования PCRE, так что вы можете попробовать использовать PCRE напрямую, поскольку он поддерживает частичные совпадения.

#include <stdio.h>
#include <pcre.h>

void test_match(pcre *re, char *subject);

void test_match(pcre *re, char *subject) {
  int rc = pcre_exec(re, NULL, subject, (int)strlen(subject),
                     0, PCRE_PARTIAL, NULL, 0);
  printf("%s: %s\n", subject,
         rc == 0 || rc == PCRE_ERROR_PARTIAL ?
         "match or partial" : "no match");
}

int main (int argc, const char * argv[]) {
  pcre *re;
  const char *errstr;
  int erroffset;

  re = pcre_compile("^ABC$", 0, &errstr, &erroffset, NULL);
  test_match(re, "A");
  test_match(re, "AB");
  test_match(re, "ABC");
  test_match(re, "ABD");

  return 0;
}

Напечатает:

A: match or partial
AB: match or partial
ABC: match or partial
ABD: no match
0 голосов
/ 18 января 2012

Я бы просто написал скрипт, чтобы взять регулярное выражение и разделить его так, чтобы регулярное выражение ABCD стало новым регулярным выражением: ^ (ABCD | ABC | AB | A) $

Скобки будут хитрыми, поэтому избегайтеих, если это возможно.В противном случае вы должны учесть это, просто добавив правильное количество закрывающих паренов.Также вам придется токенизировать строку ABCD с помощью оператора регулярных выражений, чтобы не разбивать что-то вроде \ * +

...