【问题标题】:Best Practice: Partial Regex Matching最佳实践:部分正则表达式匹配
【发布时间】:2012-01-11 17:20:12
【问题描述】:

我不确定正则表达式是这里的最佳解决方案,但它们似乎足够合乎逻辑;我只是不确定如何实际实现这一点。

基本上,我希望我的用户能够输入方法名称并在每次输入字符后对其进行有效性解析。我已经将有效的函数格式定义为正则表达式,并且很容易测试两者是否匹配。麻烦的是,我希望能够进行部分匹配,以便让用户知道,“到目前为止,这是有效的”。

例如,

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

是一个有效的方法。它可以通过一个简单的正则表达式字符串来匹配,例如

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

。但我希望能够拥有相同的正则表达式字符串“匹配”

+(NSStr

(我意识到这是使用正则表达式的一种倒退方式)。我仍然不希望正则表达式匹配

Q)(NStr

有没有办法用标准的正则表达式函数来实现这样的事情,还是我必须做一些更激烈的事情?

非常感谢!你们是无价之宝。


经过进一步思考,我想我可以让我的问题更清楚一点(也更简洁一点):通常,人们使用正则表达式来查找文本中的模式。即,“猫”或“婴儿床”在本段中出现了多少次。我希望做相反的事情,在正则表达式中寻找一个字符串。也就是说,这个字符串有多少从头开始匹配这个正则表达式。最终,我想返回字符串停止匹配相关正则表达式的索引。

【问题讨论】:

  • 您的真正目标似乎是为 绝对无效 的模式创建一个正则表达式,然后在匹配该模式时触发错误。因此,您可能想研究匹配语言的补语。请注意,正则语言的补语可能是正则的,也可能不是正则的!
  • 沿着这些思路,我建议尝试找到对 Objective-C 语法的良好描述(可能是上下文无关的语法),看看你可以与方法声明规则的补充匹配多少正则表达式。
  • +1 提出了一个有趣的问题! :-)
  • 很好的建议,虽然我不知道它们是否符合我的最终目标:告诉字符串匹配了多少正则表达式。我需要进入我的男人洞穴并思考这些新的可能性:)
  • 啊,既然我看到了你的编辑和你的最终目标,我想到了一个稍微不同的方法。为字符串的每个组件找出一个正则表达式,然后单独匹配每个组件,跟踪每次匹配的字符串数量,并在第一次失败时返回模式停止匹配的索引。换句话说,您可能需要编写一个小的“状态机”(由正则表达式表示的模式组成)。不幸的是,我根本不了解 Objective-C,因此无法评论语法或特定方法。也许我会写一个 C 答案。

标签: objective-c regex parsing coding-style regexkit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我只想编写一个脚本来获取正则表达式并将其拆分,以便正则表达式 A B C D 成为新的正则表达式: ^(ABCD|ABC|AB|A)$

    括号会很棘手,因此请尽可能避免使用它们。否则,您可能必须通过添加正确数量的右括号来解决这一问题。此外,您必须通过正则表达式运算符对 ABCD 字符串进行标记,这样您就不会拆分 \*+

    之类的内容

    【讨论】:

      猜你喜欢
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 2015-04-12
      • 2017-11-29
      • 2017-06-23
      相关资源
      最近更新 更多