2009-11-05 3 views
2

В настоящее время у меня есть основное регулярное выражение в javascript для замены всех пробелов в строке с помощью двоеточия. Некоторые символы внутри строки содержат кавычки. В идеале я хотел бы заменить пробел полутолдом, за исключением пробелов в кавычках.Javascript regex

var stringin = "\"james johnson\" joe \"wendy johnson\" tony"; 
var stringout = stringin.replace(/\s+/g, ":"); 
alert(stringout); 

Благодаря Робин

ответ

11

Попробуйте что-то вроде этого:

var stringin = "\"james johnson\" joe \"wendy johnson\" tony"; 
var stringout = stringin.replace(/\s+(?=([^"]*"[^"]*")*[^"]*$)/g, ":"); 

Обратите внимание, что он сломается, когда спасшиеся кавычки в строке:

"ab \" cd" ef "gh ij" 
+0

Очень умный. Мне это нравится. Попытались сломать его без успеха. –

+0

Спасибо Тим. Я обновил случай, когда он сломается. Но ОП не упоминал, что могут произойти экранированные кавычки. –

+0

Хорошая точка. Вы можете обойти это так: '\ s + (? = ((?: \\" | [^ "]) * (?

2

В этом случае Одно только регулярные выражения - это не самый простой способ сделать это:

<html><body><script> 

var stringin = "\"james \\\"johnson\" joe \"wendy johnson\" tony"; 
var splitstring = stringin.match (/"(?:\\"|[^"])+"|\S+/g); 
var stringout = splitstring.join (":"); 
alert(stringout); 

</script></body></html> 

Здесь сложное регулярное выражение, содержащее \\" это для случая, когда вы хотите кавычки экранированы, как \" в процитированных строках, чтобы работать. Если вам это не нужно, четвертая строка может быть упрощена до

var splitstring = stringin.match (/"[^"]+"|\S+/g); 
+0

Вы захотите обменять '[^"] 'и' \\ "' вокруг. В противном случае обратная косая черта, которая подразумевается как побег, «съедается» с помощью '[^"] 'или добавляет обратную косую черту в ваш отрицательный класс символов. Кроме этого, ваш путь более интуитивно понятен (и в случае экранированных символов , рабочее решение). +1 –

+0

Спасибо, что указали это. – 2009-11-05 14:38:24

2

в JavaScript, вы можете легко сделать модные замены с обратными вызовами

var str = '"james \\"bigboy\\" johnson" joe "wendy johnson" tony'; 

    alert(
     str.replace(/("(\\.|[^"])*")|\s+/g, function($0, $1) { return $1 || ":" }) 
    );