【问题标题】:Whole-word matching using regex使用正则表达式进行全词匹配
【发布时间】:2015-06-26 04:08:20
【问题描述】:

我想要一个匹配“bananas”或“pajamas”但不匹配“bananas2”或“bananaaspajamas”或“banana”或基本上除了这两个词之外的任何内容的 C++ 正则表达式。所以我这样做了:

#include <regex>

int main(int argc, char** argv) {
  static const std::regex bp = std::regex("\bbananas\b|\bpajamas\b");
  printf("%d\n", std::regex_match("bananas", bp));
}

除了打印0!是什么赋予了? /\bbananas\b|\bpajamas\b/.test('bananas') 在 Javascript 中给了我 true 那么 C++ 有什么不同?

【问题讨论】:

  • \ 加倍\b。目前,您指定退格字符。由于您正在为正则表达式构造函数指定一个字符串,因此您需要确保正则表达式构造函数看到正确的字符串 - 如果您希望构造函数看到 \b\s,则需要编写 "\\b""\\s"在字符串中。 C++11 中还有原始字符串构造,IIRC

标签: c++ regex c++11


【解决方案1】:

正则表达式字符串应该有\bbananas\b|\bpajamas\b。但在 C++ 中,"\bbananas\b|\bpajamas\b" 返回bbananasb|bpajamasb。因此,您必须使用额外的\\,例如"\\bbananas\\b|\\bpajamas\\b"

【讨论】:

    【解决方案2】:

    您不应该为此使用正则表达式。如果你想找出一个字符串是否是两个单词之一,只需使用简单的相等比较:

    if (str == "bananas" || str == "pajamas") {
        // OK
    }
    

    如果你有更多的可能性,你可以使用某种集合:

    const std::unordered_set<std::string> words {
        "bananas",
        "pajamas",
        "papayas"
    };
    
    if (words.find(str) != words.end()) {
        // OK
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 2015-04-13
      • 1970-01-01
      • 2015-12-13
      • 2016-04-20
      相关资源
      最近更新 更多