【问题标题】:Glib regex for matching whole word?用于匹配整个单词的 Glib 正则表达式?
【发布时间】:2018-04-09 00:03:25
【问题描述】:

要匹配整个单词,正则表达式 \bword\b 就足够了。然而下面的代码总是返回 0 个匹配项

try {
        string pattern = "\bhtml\b";
        Regex wordRegex = new Regex (pattern, RegexCompileFlags.CASELESS, RegexMatchFlags.NOTEMPTY);
        MatchInfo matchInfo;
        string lineOfText = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";

        wordRegex.match (lineOfText, RegexMatchFlags.NOTEMPTY, out matchInfo);
        stdout.printf ("Match count is: %d\n", matchInfo.get_match_count ());
    } catch (RegexError regexError) {
        stderr.printf ("Regex error: %s\n", regexError.message);
    }

这应该可以作为测试 \bhtml\b 模式在测试引擎中返回一个匹配所提供字符串的匹配项。但在这个程序上,它返回 0 个匹配项。代码错了吗? Glib 中的什么正则表达式会用于匹配整个单词?

【问题讨论】:

    标签: regex pcre glib vala


    【解决方案1】:

    看起来你也必须转义反斜杠:

    try {
            string pattern = "\\bhtml\\b";
            Regex wordRegex = new Regex (pattern, RegexCompileFlags.CASELESS, RegexMatchFlags.NOTEMPTY);
            MatchInfo matchInfo;
            string lineOfText = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
    
            wordRegex.match (lineOfText, RegexMatchFlags.NOTEMPTY, out matchInfo);
            stdout.printf ("Match count is: %d\n", matchInfo.get_match_count ());
        } catch (RegexError regexError) {
            stderr.printf ("Regex error: %s\n", regexError.message);
        }
    

    输出:

    Match count is: 1
    

    Demo

    【讨论】:

      【解决方案2】:

      您可以使用regular expression literals 简化您的代码:

      Regex regex = /\bhtml\b/i;
      

      您不必在正则表达式文字语法中引用反斜杠。 (不过前面的斜线会有问题。)

      完整示例:

      void test_match (string text, Regex regex) {
          MatchInfo match_info;
          if (regex.match (text, RegexMatchFlags.NOTEMPTY, out match_info)) {
              stdout.printf ("Match count is: %d\n", match_info.get_match_count ());
          }
          else {
              stdout.printf ("No match");
          }
      }
      
      int main () {
          Regex regex = /\bhtml\b/i;
          test_match ("<!DOCTYPE html PUBLIC>", regex);
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 2012-01-06
        • 2011-12-16
        • 2011-08-07
        • 2017-07-08
        相关资源
        最近更新 更多