【问题标题】:Capture with regexp chain where not matching a word使用不匹配单词的正则表达式链捕获
【发布时间】:2014-03-07 12:49:40
【问题描述】:

我想捕获出现两次单词SAT 之间且不包含SAT 的字符串。到目前为止我发现了这个,它不起作用

QLatin1String(".*SAT([^(SAT)]*)SAT.*")

我担心[^(SAT)]* 没有做我想做的事,那就是找到一个没有单词SAT 的字符串。或者也许我捕捉的方式不好:

QRegExp rx(pat);
int p = 0;
QString cap = QString::null;

if((p = rx.indexIn(str, p)) != -1) 
    cap = rx.cap(1).trimmed();

【问题讨论】:

标签: c++ regex qt capture


【解决方案1】:

试试这个:

(?<=SAT)(.+?)(?=SAT)

它实际上做的是向后和向前寻找SAT

如果您想测试每个字符串并使用整个字符串作为样本,那么只需使用这个修改后的版本:^(?&lt;=SAT)(.+?)(?=SAT)$


顺便说一句,刚刚尝试了这个(SAT([^(SAT)]+)SAT),它似乎也在工作。这是一个演示:http://regex101.com/r/fJ4gO5

【讨论】:

    【解决方案2】:

    你可以使用惰性量词'?'。

    (?<=SAT).*?(?=SAT)
    

    基本上,您搜索 SAT,然后搜索尽可能少的符号,直到找到第二个 SAT。因此,您捕获的字符串中不会有 SAT。

    【讨论】:

    • 大声笑,你刚刚抓住了我几秒钟!
    【解决方案3】:

    我有这个:

    首先,我在第一次出现SAT 后捕获整个字符串

    const QString pat = QLatin1String("SAT(.*)");
    QRegExp rx(pat);
    int p = 0;
    QString cap = QString::null;
    
    if((p = rx.indexIn(str, p)) != -1) 
        cap = rx.cap(1).trimmed();
    

    然后,我在结果cap 中查找SAT 的位置。如果我真的可以再次找到这个SAT,我会在SAT 之前选择cap 中的字符:

    QRegExp rxrev(QLatin1String("SAT"));
    if((p = rxrev.indexIn(cap, 0)) != -1) 
       cap = cap.mid(0,p);
    

    它的优点是它只使用最简单的QRegEx方法和工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2011-09-20
      • 2015-12-13
      相关资源
      最近更新 更多