【问题标题】:QRegExp not finding expected string patternQRegExp 没有找到预期的字符串模式
【发布时间】:2014-07-25 21:24:06
【问题描述】:

我在 Qt 5.2 中工作,我有一段代码接受一个字符串并根据其格式输入几个 if 语句之一。搜索的格式之一是字母“RCV”,后跟可变数量的数字、一个小数,然后是一个数字。一行中可以有多个这些值,用“|”分隔,例如它可以是一个值,如“RCV0123456.1”或多个值,如“RCV12345.1|RCV678.9”。现在我正在使用 QRegExp 类来查找这个,如下所示:

QString value = "RCV000030249.2|RCV000035360.2";    //Note: real test value from my code
if(QRegExp("^[RCV\d+\.\d\|?]+$").exactMatch(value))
    std::cout << ":D" << std::endl;
else
    std::cout << ":(" << std::endl;

我希望它使用 if 语句,但它一直进入 else 语句。我的正则表达式有什么问题吗?

【问题讨论】:

  • 我认为您必须转义正则表达式字符串中的反斜杠,例如"^[RCV\\d+\\.\\d\\|?]+$"。奇怪的是它甚至可以编译。
  • @vahancho 感谢您的提示,我不需要像那样进行更改,但它让我走上了正轨。在'.'之前我只需要一个反斜杠。和'|'因为我希望它识别字符本身而不是它们通常表示的元字符,但是由于我在寻找'\d',所以我需要'\\d',所以它不会只匹配字母'd'。至于编译注释,我认为它编译是有道理的,因为语法仍然有效,它只是寻找错误的东西。再次感谢您的帮助! :)
  • @vahancho:编译时带有警告(g++)。
  • @Unihedron 感谢您的评论,[] 实际上确实有效,但这是一个不同的问题,vahancho 的评论和我的回复涵盖了解决方案
  • 转义反斜杠会发现你第一次出现。如果你只需要检查是否至少找到了一个你的罚款,为了找到所有的出现,你必须通过最后一个匹配的偏移量来循环字符串。

标签: c++ regex qt


【解决方案1】:

您的表达方式应该类似于评论中的@vahancho 提及:

if(QRegExp("^[RCV\\d+\\.\\d\\|?]+$").exactMatch(value))

如果你使用 C++11,那么你可以使用它的原始字符串特性:

if(QRegExp(R"(^[RCV\d+\.\d\|?]+$)").exactMatch(value))

【讨论】:

    【解决方案2】:

    除了转义其他人在答案和 cmets 中提到的反斜杠之外,

    一行中可以有多个这些值,用“|”分隔,例如它可以是一个像“RCV0123456.1”这样的值,也可以是多个像“RCV12345.1|RCV678.9”这样的值。

    [RCV\d+\.\d\|?] 可能没有达到您的预期。也许你想要() 而不是[]

    /^
      [RCV\d+\.\d\|?]+ # More than one of characters from the list:
                       # R, C, V, a digit, a +, a dot, a digit, a |, a ?
     $/x
    

    /^
      (
        RCV\d+\.\d     # RCV, some digits, a dot, followed by a digit
        \|?            # Optional: a |
      )+               # Quantifier of one or more
     $/x
    

    另外,也许您可​​以修改正则表达式,使可选的| 要求组*再次匹配*:

    /^
      (RCV\d+\.\d)     # RCV, some digits, a dot, followed by a digit
      (
        \|(?1)         # A |, then match subpattern 1 (Above)
      )+               # Quantifier of one or more
     $/x
    

    【讨论】:

    • 不确定\|(?1),但不匹配子模式\|($1)?但不会帮助操作,QRegExp 不会在正则表达式本身中使用 captureGroups。
    【解决方案3】:

    检查是否只有符合添加的有效出现需要| 开始第二次出现(即使使用双引号,您的实现也不需要|):

    QString value = "RCV000030249.2|RCV000035360.2";    //Note: real test value from my code
    if(QRegExp("^RCV\\d+\\.\\d(\\|RCV\\d+\\.\\d)*$").exactMatch(value))
        std::cout << ":D" << std::endl;
    else
        std::cout << ":(" << std::endl;
    

    【讨论】:

      猜你喜欢
      • 2014-01-30
      • 2018-01-02
      • 1970-01-01
      • 2017-01-13
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多