2013-06-11 3 views
0

У меня есть следующая строка:Регулярного выражение соответствует любому символу в начале заканчивается определенной строкой

"bar foo test-line drop-line" 

Мне нужно заменить слова, которые начинаются с чем и заканчиваются с «-линией».

в основном имеющие:

"bar foo new_word new_word" 

Я пробовал:

string.replace(/\.-line$/g,'new_word') 

, но он не работает.

+0

try /.*(-line)$/g – user1600124

+0

hmm .. это не работает – user1600124

ответ

4

Попробуйте это как регулярное выражение:

/\S+-line(?![-\w])/ 

Слово якорь здесь не подходит, так как черточки не считаются частью слова, так /\S+-line\b/ бы ошибочно соответствовать text-with-line-not-to-be-replaced. Следовательно, конструкция lookahead.

Конечно, в зависимости от вашего использования, \S может показаться немного грубым. Если ваши слова действительно состоять только из букв, то тир и т.д., то вы можете использовать normal* (special normal*)* шаблон:

/[a-z]+(-[a-z]+)*-line(?![-\w])/i 

(нормальный: [a-z], специальный: -)

(редактирование: изменил конструкцию опережения, благодаря @ thg435)

+1

Я бы написал lookahead как '(?! [- \ w])', чтобы позаботиться о возможной пунктуации. – georg

+0

фантастическое спасибо. Я только не понимаю последнюю часть (?! [- \ w]), не могли бы вы объяснить ее? Большое спасибо – kiwi1342

+2

Это негативный взгляд. Это означает «найти позицию, в которой последует не черта или символ слова». Общая конструкция - '(?! ...)', где '...' является регулярным выражением. – fge

0

в вашем регулярном выражении, вы можете использовать \ б, чтобы обнаружить начало новых слов и \ W для «символов слова»:

"your string".replace(/\b\w+-line\b/g,'new_word') 

См http://www.w3schools.com/jsref/jsref_obj_regexp.asp

+1

Будет соответствовать 'here-are-two-lines' и заменить его' here-are-new_words' ... – fge

+0

Это просто зависит от того, что вы считаете словом. Если вы хотите включить минус-символы, просто сделайте это: «» .replace (/ \ b [- \ w] + - line \ b/g, 'new_word') – vcarel

+0

Это не вопрос того, что вы считаете границей слов но то, что двигатель регулярных выражений считает границей слов ... – fge

0

Как насчет

string.replace(/\b\S+-line\b/g,'new_word') 

\b Слово граница

\S не пробельные

Как FGE проницательно отмечает, нам нужно \b после line поэтому мы не поймать вещи, оканчивающиеся linesliner и т. Д. И т. Д. И т.д. и т.д.

+0

Будет соответствовать 'foo-bar-lines' и заменить его' foo-new_words'! – fge

+0

что ... это работает для меня на самом деле – user1600124

+0

@ user1600124 попробуйте вход, который я упомянул в комментарии, и см. – fge