2013-12-09 2 views
3

Мне была поручена задача, для которой требуется много времени.Заменить все, кроме группы Regex?

Изображение говорят все:

Это то, что у меня есть: (x100 раз):

enter image description here

И мне нужно, чтобы извлечь это значение только

enter image description here

Как я могу получить значение?

Я сделал это с этим регулярным выражением:

DbCommand.*?\("(.*?)"\);

Как вы можете видеть, это работа:

enter image description here

И после функция replace (replace to $1) я получить чистое значение:

enter image description here

, но проблема в том, что мне нужно только в чистые ценности, а не остальной части непревзойденной группы:

Вопрос: Другими словами:

Как я могу получить очищенный результат, такой как:

Eservices_Claims_Get_Pending_Claims_List 
Eservices_Claims_Get_Pending_Claims_Step1 

Here is my code at Online regexer

  • Есть ли способ заменить «все, кроме согласованной группы»?

p.s. Я знаю, что есть и другие способы сделать это, но я предпочитаю решение регулярных выражений (который также поможет мне понять регулярное выражение лучше)

+0

RegexBuddy бы это сделать ... также запуск его через визуальную студию даст вам то, что вы хотите ... Ваша ссылка не работает, поэтому я не могу больше помочь. – abc123

+0

@ abc123, пожалуйста, прочитайте мой PS –

+0

Я имел в виду использование Regex ... – abc123

ответ

1

Вы должны быть в состоянии сделать глобальный заменить на:

public static DataTable.*?{.*?DbCommand.*?\("(.*?)"\);.*?}

All Я сделал это, чтобы он соответствовал всему блоку, включая определение функции, используя пучок .*? s.

Примечание: убедитесь, что ваши настройки регулярных выражений таковы, что точка (.) соответствует всем символам, включая символы перевода.


В самом деле, если вы хотите, чтобы закрыть все пробелы, вы можете хлопнуть \s* на фронте и заменить $1\n:

\s*public static DataTable.*?{.*?DbCommand.*?\("(.*?)"\);.*?}

Использование тестового примера: http://regexr.com?37ibi

+0

так что это должно быть '[\ s \ S]' –

+0

Отлично! http://regexr.com?37ibr –

+0

@RoyiNamir Конечно, или используйте опцию «dotall» (в JavaScript, я считаю, что это флаг 's') –

2

К сожалению, JavaScript не понимает lookbehind. Если бы это было так, вы могли бы изменить свое регулярное выражение в соответствии с .*?, предшествовавшим (lookbehind), DbCommand.*?\(" и следом (lookahead) на "\);.

С этим решением отказано, я считаю, что чистое решение является выполнение двух матчей:

// you probably want to build the regexps dynamically 
var regexG = /DbCommand.*?\("(.*?)"\);/g; 
var regex = /DbCommand.*?\("(.*?)"\);/; 
var matches = str.match(regexG).map(function(item){ return item.match(regex)[1] }); 

console.log(matches); 
// ["Eservices_Claims_Get_Pending_Claims_List", "Eservices_Claims_Get_Pending_Claims_Step1"] 

DEMO: http://jsbin.com/aqaBobOP/2/edit

0

Попробуйте просто заменить весь документ, заменяющий используя это выражение:

^(?: |\t)*(?:(?!DbCommand).)*$ 

После этого вы останетесь только с линиями, начинающимися со строки DbCommand

Вы можете затем удалить промежутки между ними, заменив: \r?\n\s* с \n глобально.

Вот пример этой работы: http://regexr.com?37ic4

+0

, это не даст чистых результатов. –

1

Вы можете использовать это (без корпуса и многострочного варианта игнорируемого, с глобальным поиском):

pattern: (?:[^D]+|\BD|D(?!bCommand))+|DbCommand [^"]+"([^"]+) 
replace: $1\n 
Смежные вопросы