• 7131阅读
  • 13回复

[提问]有没有办法让QString::replace只执行一次 [复制链接]

上一主题 下一主题
离线呆呆很呆
 
只看楼主 倒序阅读 楼主  发表于: 2013-04-04
我需要用QString & QString::replace(const QRegExp & rx, const QString & after)
可是他是默认全部替换的 我只需要替换第一个 如果是QString替换成QString还好办 可又需要正则表达式
找了半天文档 没有找到相应的函数 又搜了半天百度、谷歌 还是无果
离线roywillow

只看该作者 1楼 发表于: 2013-04-04
回 楼主(呆呆很呆) 的帖子
那就只有先find了?
另外应该有重载是不用正则的吧
再说就算用正则,也可以直接用固定的字符串啊
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线呆呆很呆
只看该作者 2楼 发表于: 2013-04-04
回 1楼(roywillow) 的帖子
1.find倒是想过 可是替换条件里的“\\1”什么的还要自己处理 很麻烦的 我去查了源码 一大堆
2.可是我必须要用正则啊 而且\\1必须考虑啊
离线jdwx

只看该作者 3楼 发表于: 2013-04-04
回 2楼(呆呆很呆) 的帖子
用find或indexOf找到第一个,在第一个要替换的部分后面,把字符串拆成两段,前半段替换,再把两个字符串连起来。
源串:123abc,4567abcggjdlkjabc    替换第一个abc为xxx
拆成两个:123abc和,4567abcggjdlkjabc
替换第一个:123xxx
连起来:123xxx,4567abcggjdlkjabc
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线呆呆很呆
只看该作者 4楼 发表于: 2013-04-04
回 3楼(jdwx) 的帖子
这个我也想到了 那后面可能有的(?=xxx)怎么办 再弄个正则表达式分析器?
比如:abc aaa abc aaa 符合 abc(?= a)
拆开后:abc、aaa abc aaa 却不符合 abc(?= a)
matchedLength不计(?= a) 只返回3
离线rpdhunter

只看该作者 5楼 发表于: 2013-04-04
回 4楼(呆呆很呆) 的帖子
不是很懂你的意思
离线呆呆很呆
只看该作者 6楼 发表于: 2013-04-04
回 5楼(rpdhunter) 的帖子
有什么不能懂的吗? 就是说合起来匹配分开就不能匹配的正则表达式 怎么处理
离线rpdhunter

只看该作者 7楼 发表于: 2013-04-04
回 6楼(呆呆很呆) 的帖子
什么叫做合起来匹配,分开就不匹配呢?

abc aaa abc aaa,查找到2个abc
:abc、aaa abc aaa ,第一个也能查找到abc啊
离线呆呆很呆
只看该作者 8楼 发表于: 2013-04-04
回 7楼(rpdhunter) 的帖子
abc(?= a)查不到啊
离线呆呆很呆
只看该作者 9楼 发表于: 2013-04-04
回 7楼(rpdhunter) 的帖子
能查到abc 但是用户可能输入的abc(?= a)却查不到 我怎么解释
离线呆呆很呆
只看该作者 10楼 发表于: 2013-04-04
  1. #include <QtCore>
  2. int main(int argc,char* argv[])
  3. {
  4.     QCoreApplication app(argc,argv);
  5.     QRegExp reg("abc(?= a)");
  6.     QString s1("abc aaa");
  7.     QString s2("abc");
  8.     qDebug()<<s1.indexOf(reg)<<s2.indexOf(reg);
  9.     return 0;
  10. }

输出:
  1. 0 -1



离线roywillow

只看该作者 11楼 发表于: 2013-04-04
回 9楼(呆呆很呆) 的帖子
如果只是正则的使用不太清楚的话,可以先试试用RegexBuddy之类的软件调试一下
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线呆呆很呆
只看该作者 12楼 发表于: 2013-04-05
回 11楼(roywillow) 的帖子
不是这个意思。。。。。
离线呆呆很呆
只看该作者 13楼 发表于: 2013-04-05
还有一个办法是这样
  1. void replaceOnce(QString &s,const QRegExp &exp2,const QString &after)
  2. {
  3. QRegExp exp(exp2);
  4. int index = s.indexOf(exp);
  5. if(index != -1){
  6. int length = exp.matchedLength();
  7. for(int i=length;;++i){
  8. QString ref = s.mid(index,i);
  9. if(ref.indexOf(exp) != -1){
  10. QString afterReplace = ref.replace(exp,after);
  11. s = s.replace(index,i,afterReplace);
  12. break;
  13. }
  14. }
  15. }
  16. }

可是QStringRef没有重载indexOf(QRegExp) 所以效率是个问题 只能深复制用QString了
快速回复
限100 字节
 
上一个 下一个