使用正则表达式替换表达式与子部分?

时间:2013-06-19 06:11:01

标签: regex phpstorm

我的IDE PHPstorm允许你使用正则表达式进行搜索和替换,我发现自己经常做的事情之一是切换顺序或操作,也就是说,在函数中我将使用列表b设置列表中的项目的值b作为价值观。

但是在函数b中我想要反转它。 所以我想使用列表a作为值来设置列表b中的项目的值。

一个恰当的例子就是:

var $clipDetailsGame        = $('#clipDetailsGame');
var $clipDetailsTitle       = $('#clipDetailsTitle');
var $clipDetailsByline      = $('#clipDetailsByline');
var $clipDetailsTeamOne     = $('#clipDetailsTeamOne');
var $clipDetailsTeamTwo     = $('#clipDetailsTeamTwo');
var $clipDetailsReferee     = $('#clipDetailsReferee');
var $clipDetailsDescription = $('#clipDetailsDescription');
var $clipDetailsCompetition = $('#clipDetailsCompetition');

function a(clip){
    clip.data('gameId'       , $clipDetailsGame.val());
    clip.data('title'        , $clipDetailsTitle.val());
    clip.data('byline'       , $clipDetailsByline.val());
    clip.data('team1'        , $clipDetailsTeamOne.val());
    clip.data('team2'        , $clipDetailsTeamTwo.val());
    clip.data('refereeId'    , $clipDetailsReferee.val());
    clip.data('description'  , $clipDetailsDescription.val());
    clip.data('competitionId', $clipDetailsCompetition.val()); 
}

function b (clip){
    $clipDetailsGame       .val(clip.data('gameId'));
    $clipDetailsTitle      .val(clip.data('title'));
    $clipDetailsByline     .val(clip.data('byline'));
    $clipDetailsTeamOne    .val(clip.data('team1'));
    $clipDetailsTeamTwo    .val(clip.data('team2'));
    $clipDetailsReferee    .val(clip.data('refereeId'));
    $clipDetailsDescription.val(clip.data('description'));
    $clipDetailsCompetition.val(clip.data('competitionId')); 
}

排除格式化(只是为了让我的观点更加清晰),我可以用什么样的正则表达式代替我?

2 个答案:

答案 0 :(得分:4)

基本正则表达式 - 没有什么花哨或复杂的

搜索:(clip\.data\('[a-zA-Z0-9]+')\s*, (\$[a-zA-Z0-9]+\.val\()(\)\);)
替换为:\$2\$1\$3

这里唯一与PhpStorm相关的东西是替换字符串格式 - 你必须“转义”$才能使它工作(即必须\$2才能使用第二个回溯而不仅仅是{{1 }或$2(在其他引擎中使用))。

这会改变这个:

\2

进入这个:

clip.data('gameId'       , $clipDetailsGame.val());
clip.data('title'        , $clipDetailsTitle.val());
clip.data('byline'       , $clipDetailsByline.val());
clip.data('team1'        , $clipDetailsTeamOne.val());
clip.data('team2'        , $clipDetailsTeamTwo.val());
clip.data('refereeId'    , $clipDetailsReferee.val());
clip.data('description'  , $clipDetailsDescription.val());
clip.data('competitionId', $clipDetailsCompetition.val()); 

有用的链接: http://www.jetbrains.com/phpstorm/webhelp/regular-expression-syntax-reference.html

答案 1 :(得分:2)

清理(不是这个问题的答案,而是组织代码以使搜索和替换不必要的另一种方式):

var $details = {};
var fields = [
    'Game', 'Title', 'Byline', 'TeamOne', 'TeamTwo', 'Referee', 'Description',
    'Competition'
];
for(field in fields) {
    $details[field] = $('#clipDetails' + field);
}

function a(clip) {
    for(field in fields) {
        clip.data(field, $details[fields].val());
    }
}

function b(clip) {
    for(field in fields) {
        $details[field].val(clip.data(field));
    }
}

是的,我知道存在微小的命名不一致意味着这不是开箱即用的,例如GamegameId。这也是清理它的绝佳场合:)。如果您仍想保留ID的标题大小写(例如#clipDetailsGame而不是#clipDetailsgame),请将其保留在fields数组中的标题大小写中并使用toLowerCase你需要小写的地方。

顺便说一下,有一个有趣的读物是什么让DRY成为一件好事:https://softwareengineering.stackexchange.com/questions/103233/why-is-dry-important