2014-02-18 3 views
0

В Javascript У меня есть несколько слов, разделенных точкой или одной или несколькими пробелами (или концом строки).
Я хотел бы заменить некоторые его части, чтобы вставить пользовательскую информацию в соответствующие места.Регулярное выражение регулярных выражений Javascript

Пример:

var x = "test1.test  test2 test3.xyz test4"; 

Если есть точка должна быть заменена «.X_»
Если есть один или больше места (s) и слово, прежде чем не содержит точку, замените " .X "

Таким образом, желаемый результат для приведенного выше примера будет:

"test1.X_test test2.X test3.X_xyz test4.X" 

Могу ли я сделать это в одном регулярном выражении заменить? Если да, то как?
Если мне нужны два или более, что бы они сделали?

Спасибо, кучка.

+4

Ваши правила не будут выдавать желаемый результат –

+2

Не имеете в виду, если в слове нет точки, она должна добавить '.X' в конце этого слова? – rednaw

+0

@WillP .: Я исправил правила. rednaw: вы правы. –

ответ

1

Попробуйте это:

var str = 'test1.test  test2 test3.xyz test4'; 

str = str.replace(/(\w+)\.(\w+)/g, '$1.X_$2'); 
str = str.replace(/(|^)(\w+)(|$)/g, '$1$2.X$3'); 

console.log(str); 

В первом replace он заменяет точку в пунктирные слова с .X_, где dott ed word is два слова с точкой между ними.

Во втором replace он добавляет .X к словам, которые не имеют точек, где слово, которые не имеют точек слово, которые предшествуют освещения пространства ИЛИ начала строки и затем в пробел ИЛИ конец строки.

+0

Это прекрасно! именно то, что мне нужно! Хотя есть небольшая ошибка: третий параметр «str» не нужен. :) ** Большое спасибо! ** –

+0

@JanPaepke Да, вы правы, я сделал это сначала на python, так что это была ошибка копирования/вставки. Теперь я отредактировал себя, потому что почему-то ваше редактирование было отвергнуто другими людьми. – rednaw

1

Чтобы ответить на этот вопрос:

Если есть точка должна быть заменена «.X_»

Если есть один или несколько пробелов она должна быть заменена на «.X»

ли это:

x.replace(/\./g, '.X_').replace(/\s+/g, '.X'); 

Edit: Чтобы получить желаемый результат (а не ваших правил), вы можете сделать это:

var words = x.replace(/\s+/g, ' ').split(' '); 
for (var i = 0, l = words.length; i < l; i++) { 
    if (words[i].indexOf('.') === -1) { 
     words[i] += ".X"; 
    } 
    else { 
     words[i] = words[i].replace(/\./g, '.X_'); 
    } 
} 
x = words.join(' '); 

В принципе ...

  1. Strip все множественные пробелы и создать массив «слов»
  2. Перебирайте каждое слово.
  3. Если он не имеет период в нем, а затем добавить «.X» в конце слова
  4. Else, замените периоды с «.X_»
  5. Вступи „слова“ обратно в строку и разделить ее пробелами.

Edit 2:

Вот решение, используя только в JavaScript функцию замены:

x.replace(/\s+/g, ' ') // replace multiple spaces with one space 
.replace(/\./g, '.X_') // replace dots with .X_ 
// find words without dots and add a ".X" to the end 
.replace(/(^|\s)([^\s\.]+)($|\s)/g, "$1$2.X$3"); 
+0

спасибо. Это близко, но не совсем так. С помощью этого регулярного выражения он также добавил бы .X после «x.X_y». Итак, в приведенном выше примере первая часть будет «test1.X_test.X», что неверно ... –

+0

Спасибо - цикл был своего рода отступлением. Я ищу более элегантный способ сделать это. Должно быть регулярное выражение для «совпадений пробелов, но только если между ним и последним пробелом нет точки» –

+0

Я обновил свой ответ с помощью решения только с помощью функции замены. –

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