регулярное выражение с просмотром назад в javascript

я пытаюсь сопоставить некоторые слова в тексте

рабочий пример (что я хочу) regex101:

regex = /(?<![a-z])word/g
text = word 1word !word aword

будут сопоставлены только первые три слова, чего я и хочу добиться. но взгляд сзади не будет работать в javascript :(

так что теперь я пробую это regex101:

regex = /(\b|\B)word/g
text = word 1word !word aword

но все слова будут совпадать, и им не может предшествовать другая буква, только целое число или специальные символы. если я использую только меньшую "\b", 1слово не будет совпадать, а если я использую только "\B", то !слово не совпадет

Изменить

Вывод должен быть ["слово","слово","слово"]

и 1! не должен быть включен в соответствие и не в другую группу, потому что я хочу использовать его с javascript .replace(regex,function(match){}), который не должен зацикливаться на 1 и !

Код, для которого я его использую

    for(var i = 0; i < elements.length; i++){
    text = elements[i].innerHTML;

    textnew = text.replace(regexp,function(match){
        matched = getCrosslink(match)[0];
        return "<a href='"+matched.url+"'>"+match+"</a>";
    });
    elements[i].innerHTML = textnew;
}

person 77120    schedule 13.10.2015    source источник
comment
Каков ваш ожидаемый результат   -  person Narendrasingh Sisodia    schedule 13.10.2015
comment
должны совпадать первые три слова, а не последнее (слово)   -  person 77120    schedule 13.10.2015
comment
Что вы планируете делать с первыми тремя словами после того, как сопоставите их?   -  person    schedule 13.10.2015
comment
я оберну их некоторыми html-тегами ‹a›, например   -  person 77120    schedule 13.10.2015
comment
Каково точное определение того, что вы хотите сопоставить? Совпадение с первыми тремя? Соответствует "word", если ему не предшествует буква?   -  person    schedule 13.10.2015


Ответы (2)


Захват главного героя

Трудно точно знать, что вы хотите, не видя дополнительных примеров вывода, но как насчет того, чтобы искать начало с границы или начало с небуквы. Например, вот так:

(\bword|[^a-zA-Z]word)

Выход: ['word', '1word', '!word']

Вот рабочий пример


Захват только "слова"

Если вы хотите, чтобы была захвачена только часть «слова», вы можете использовать следующее и получить вторую группу захвата:

(\b|[^a-zA-Z])(word)

Выход: ['word', 'word', 'word']

Вот рабочий пример


С заменой()

Вы можете использовать определенные группы захвата при определении значения замены, так что это будет работать для вас (где "new" — это слово, которое вы хотите использовать):

var regex = /(\b|[^a-zA-Z])(word)/g;
var text = "word 1word !word aword";

text = text.replace(regex, "$1" + "new");

вывод: "new 1new !new aword"

Вот рабочий пример

Если вы используете специальную функцию замены, попробуйте следующее:

textnew = text.replace(regexp,function (allMatch, match1, match2){
    matched = getCrosslink(match2)[0];
    return "<a href='"+matched.url+"'>"+match2+"</a>";
});

Вот рабочий пример

person musefan    schedule 13.10.2015
comment
1 и ! по-прежнему совпадают в другой группе, и это не будет работать с функцией javascripts .replace(), потому что я также буду перебирать 1 и ! - person 77120; 13.10.2015
comment
@ 77120: Вы не сказали, что вам нужно использовать функцию замены, только получить совпадения - person musefan; 13.10.2015
comment
Боюсь, мне нужно рассказать немного больше о моем коде :), я использую функцию замены, подобную этой text.replace(regex,function(match){}); - person 77120; 13.10.2015
comment
@ 77120: Хорошо, отсортировано, вы можете указать несколько параметров для получения каждой группы захвата. Посмотреть изменить - person musefan; 13.10.2015
comment
Ааа, спасибо большое, работает :). не мог понять это. - person 77120; 13.10.2015
comment
@77120: Не беспокойтесь, рад, что мы наконец добрались до цели! - person musefan; 13.10.2015

Вы можете использовать следующее регулярное выражение

([^a-zA-Z]|\b)(word)

Просто используйте replace как

var str = "word 1word !word aword";
str.replace(/([^a-zA-Z]|\b)(word)/g,"$1"+"<a>$2</a>");

Регулярное выражение

person Narendrasingh Sisodia    schedule 13.10.2015
comment
почти :), но теперь 1 и ! включены в матч - person 77120; 13.10.2015
comment
поэтому вам нужно извлечь только word, а не 1word и !word - person Narendrasingh Sisodia; 13.10.2015
comment
Для меня word 1word !word aword".match(/([^a-zA-Z]|\b)(word)/) дает ["word", "", "word"]. - person ; 13.10.2015
comment
Проверьте эту скрипту, основанную на этом ответе. - person SamWhan; 13.10.2015
comment
Или эту скрипту, которая добавляет произвольную цифру к слову, чтобы доказать, что правильное слово извлечено. - person SamWhan; 13.10.2015
comment
Обновлен мой ответ @ 77120 - person Narendrasingh Sisodia; 13.10.2015
comment
Спасибо за обновление, я думаю, что это почти работает для меня, но мне пришлось сделать еще одно обновление для моего вопроса, потому что я использую .replace(regexp,function(match) и я не уверен, как использовать $1 в этом случае - person 77120; 13.10.2015