Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed和正则表达式交换字符串的部分_Regex - Fatal编程技术网

Regex 使用sed和正则表达式交换字符串的部分

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

下面是我在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将
cutAct
的所有实例转换为
actionCut
,目的是在使用表达式对具有
Act
名称的代码的其他元素执行类似转换之前测试我的表达式,因此,它们都遵循
操作
命名约定。所以基本上:

  • 从剪贴画开始
  • 在“表演”部分之前把它切成两半,这样它就被切割并表演了
  • 大写字母“c”在cut中,因此我有“cut”和“Act”
  • 删除“Act”并将其替换为“Cut”前面的“action”
  • 这是我所追求的一个例子

    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,你一定对第一个版本发表了评论。我粘贴了错误的输出,现在已修复。