2015-12-06 3 views
5

Regex Диалект: JavaScriptУдалить все пробелы кроме того, что содержится в группе захвата

У меня есть следующий захват группы (('|").*?[^\\\2]\2), который выбирает строку в кавычках, исключая кавычки экранированы.

Матчи это, например ...

"Felix's pet" 
'Felix\'s pet' 

Однако сейчас я хотел бы, чтобы удалить все пробелы из строки кроме ничего, соответствующего этому шаблону. Есть ли способ вернуться к ссылке группы захвата \1, а затем исключить ее из матчей?

Я попытался сделать это с моим ограниченным знанием RegEx, но до сих пор я могу выбрать только пространство, непосредственно предшествующее или следующее шаблону.

Я сохранил свой тестовый сценарий на regexr для удобства, если вы хотите поиграть с моим примером.

Планируемые результаты:

key : string становится key:string

dragon : "Felix's pet" становится dragon:"Felix's pet"

"Hello World" something here "Another String"

становится

"Hello World"somethinghere"Another String"

и т.д ...

+0

@anubhava: Я не согласен с голосованием в отношении обмана - принятый ответ использует стратегию, которая работает только со специальной строковой структурой в этом вопросе, и ваш (лучший) ответ не выполняется с экранированными кавычками. Голосование для повторного открытия. –

+0

@TimPietzcker: Я достаточно уверен, что есть лучший дубликат, но я просто не мог найти, используя мой поиск. – anubhava

+2

@SnareChops: ваше регулярное выражение пытается использовать скрытые кавычки, но делает это неправильно (ваш класс символов ошибочен, и даже если он сработал, вам следует рассмотреть случай '' foo \\ '', где есть обратная косая черта перед закрывающей цитатой, но это не ускользающая обратная косая черта. Вам нужно было бы обработать такой случай? –

ответ

2

Это очень трудно сделать с регулярными выражениями. Следующие работы:

result = subject.replace(/ (?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)/g, ""); 

Я построен этот ответ от одного of my earlier answers to a similar, but not identical question; поэтому я расскажу вам об этом для объяснения.

Вы можете проверить его live on regex101.com.

0

В Javascript вы можете использовать String.replace с function as parameter. Таким образом, вы определяете группы соответствия, а затем вы можете заменить каждый из них отдельно.

Вы хотите соответствовать все пробелы

\s+ 

и вы должны соответствовать все внутри цитирует

(('|")(?:[^\\]\\\2|.)*?\2) 

так вы объедините вместе

var pattern = /\s+|(('|")(?:[^\\]\\\2|.)*?\2)/g 

и писатьзаменить заявление с анонимной функции в качестве параметра:

var filteredString = notFilteredString.replace(pattern, 
     function(match, group1) { return group1 || "" }) 

С каждым матчем функция вызывается, чтобы дать заменить строку. Регулярное выражение соответствует пробелу или контенту. Содержимое цитаты обернуто как group1, и анонимная функция возвращает group1, если group1 соответствует или ничего "" для пробелов или любого другого совпадения.

Смежные вопросы