Regex 使用sed和正则表达式交换字符串的部分
下面是我在vim中编辑的一个文件示例Regex 使用sed和正则表达式交换字符串的部分,regex,Regex,下面是我在vim中编辑的一个文件示例 cutAct = new QAction( tr( "Cut" ) ); cutAct->setShortcut( QKeySequence::Cut ); cutAct->setStatusTip( tr( "Cut the current selection" ) ); connect( cutAct, SIGNAL( triggered() ), this, SLOT( cut() ) ); 我试图从vim的命令窗格中使用sed将cutA
cutAct = new QAction( tr( "Cut" ) );
cutAct->setShortcut( QKeySequence::Cut );
cutAct->setStatusTip( tr( "Cut the current selection" ) );
connect( cutAct, SIGNAL( triggered() ), this, SLOT( cut() ) );
我试图从vim的命令窗格中使用sed将cutAct
的所有实例转换为actionCut
,目的是在使用表达式对具有Act
名称的代码的其他元素执行类似转换之前测试我的表达式,因此,它们都遵循操作
命名约定。所以基本上:
actionCut = new QAction( tr( "Cut" ) );
actionCut->setShortcut( QKeySequence::Cut );
actionCut->setStatusTip( tr( "Cut the current selection" ) );
connect( actionCut, SIGNAL( triggered() ), this, SLOT( cut() ) )
我试着用下面的命令来做
s_[a-z]\(.*\)Act_action\u\1_g
但我要说的是
actionUtAct = new Qion( tr( "Cu&t" ), this );
actionUt->setShortcut( QKeySequence::Cut );
actionUt->setStatusTip( tr( "Cut the current selection" ) );
actionOnnect( cut, SIGNAL( triggered() ), diaryEditor, SLOT( cut() ) );
这是我第一次尝试认真使用正则表达式,我相信我的表达式会返回每个字符串,以小写字母开头,在“Act”中安定,然后从末尾删除Act,将第一个字符改为大写,并在前面加上“action”,但这显然不是正在发生的事情
有人能告诉我如何修改我的表达式以实现我的目标吗?试试这个:
s_\([a-z]\w*\)Act_action\u\1_g
它产生以下结果:
actionCut = new QAction( tr( "Cut" ) );
actionCut->setShortcut( QKeySequence::Cut );
actionCut->setStatusTip( tr( "Cut the current selection" ) );
connect( actionCut, SIGNAL( triggered() ), this, SLOT( cut() ) );
*
是贪婪的,即它将匹配最长的字符串;换句话说,您正在替换“Act”的最后一次出现,而不是第一次出现
据我所知,从A到B最简单的方法是s\u cutAct\u action cut\u g
编辑:这里有一个更一般的尝试,可以按照您的描述进行操作:
s_\([a-z]+\)Act_Action\u\1_g
换句话说,对于与Act相邻的任何小写字符串,请在Action、大写之前加上前缀,并删除Act后缀。在您的示例中:
c*utAct=新的QAct*离子(tr(“切割”)
正则表达式中的组1与斜体部分匹配。首字母[a-z]
在括号外,正则表达式是贪婪的,因此*
后跟Act
将匹配字符串中的最后一个“Act”,而不是第一个
试试这个:
s\u\([a-z]\w*)Act\u action\u\1\u g
很难很快看出你的问题所在-我建议你更清楚地说明你想要的行为是什么,你看到的行为是什么。这看起来没有改变任何东西?@tripleee,你一定对第一个版本发表了评论。我粘贴了错误的输出,现在已修复。