2012-07-16 3 views
3

Я следующая строкаЧто такое регулярное выражение в JavaScript

sssHi это испытание для регулярного выражения, стер, Привет это тест для регулярного выражения

Я хотел бы заменить только

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

сегмент с некоторой другой строкой.

первый сегмент в строке «SSS Привет это тест для регулярного выражения» не следует заменить

я написал следующее регулярное выражение для того же:

/([^.]Hi\sthis\sis\sthe\stest\sfor\sregular\sExpression)|(Hi\sthis\sis\sthe\stest\sfor\sregular\sExpression)$/ 

, но она соответствует обоим сегментам , Я хочу соответствовать только второму, поскольку первый сегмент имеет префикс «sss».

[^.]  

должно соответствовать ничем, кроме новой строки справа? Так группа

"([^.]anystring)" 

должен соответствовать только «anystring», не предшествует любой chanrachter, кроме символа новой строки. Правильно ли я?

любые мысли.

+3

The. оператор внутри скобок не означает то же самое, что и снаружи. В скобках это буквальный период (.) – Exupery

+5

использовать '\ b'. например '\ b (Привет, это тест' ... ') \ b' –

+0

читать' lookahead' и 'lookbehind' утверждение [здесь] (http://www.regular-expressions.info/lookaround.html#lookahead) – diEcho

ответ

3

Соответствие строке не, которой предшествует другая строка: negative lookbehind и не поддерживается механизмом регулярного выражения JavaScript. Однако вы можете сделать это с помощью обратного вызова.

Учитывая

str = "sssHi this is the test for regular Expression,sr,Hi this is the test for regular Expression" 

Используйте функцию обратного вызова, чтобы проверить характер предшествующих str:

str.replace(/(.)Hi this is the test for regular Expression$/g, function($0,$1){ return $1 == "s" ? $0 : $1 + "replacement"; }) 
// => "sssHi this is the test for regular Expression,sr,replacement" 

Регулярное выражение соответствует обе строки, так что функция обратного вызова вызывается дважды:

  1. С
    • $0 = "sHi this is the test for regular Expression"
    • $1 = "s"
  2. С
    • $0 = ",Hi this is the test for regular Expression"
    • $1 = ","

Если $1 == "s" матч заменен $0, так что остается неизменным, в противном случае она заменяется $1 + "replacement".

Другой подход заключается в том, чтобы соответствовать второй строке, то есть той, которую вы хотите заменить, включая разделитель.

Чтобы соответствовать str предшествует запятая:

str.replace(/,Hi this is the test for regular Expression/g, ",replacement") 
// => "sssHi this is the test for regular Expression,sr,replacement" 

Для того, чтобы соответствовать str предшествовали любой не слова характера:

str.replace(/(\W)Hi this is the test for regular Expression/g, "$1replacement") 
// => "sssHi this is the test for regular Expression,sr,replacement" 

Для того, чтобы соответствовать str в конце строки:

str.replace(/Hi this is the test for regular Expression$/g, "replacement") 
// => "sssHi this is the test for regular Expression,sr,replacement" 
0

Использование

str.replace(/(.*)Hi this is the test for regular Expression/,"$1yourstring") 

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

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