Использование регулярных выражений в JavaScript для проверки повторного использования шаблона (например, одна и та же последовательность символов, объявленная дважды в строке) - PullRequest
0 голосов
/ 13 января 2011

Обратите внимание, что в этих строках текста слово "GARNSEY" объявлено дважды:

"GARNSEY B R & D B GARNSEY"
"GARNSEY B R & D GARNSEY"

Теперь это может быть D GARNSEY (без средней инициалы) или DB GARNSEY (включая среднюю букву), но мне нужно знать, упоминается ли GARNEY, потому что это означает, что фамилия упоминается дважды, один раз в начале и один раз в конце. *

Согласно книге Справочник программиста JavaScript:

"Вы можете повторить поиск этого точного символа по всему шаблону ... Вы можете сделать это с помощью \ 1. Использование \ 1 относится к результату первого сгруппированного выражения."

Хорошо, поэтому я пытаюсь «сохранить» результат первой группы \ w {1,}) \ 1, а затем пытаюсь повторно использовать его в конце, пытаясь также проверить, есть ли второе имя или нет:

 /^(\w{1,})\1\s\w{1,}((?:\s\w{1,})?)+\s+&\s+\w{1,}\s(((?:\s\w{1,})?)+)\1$/;

Тем не менее, интерпретатор JavaScript предупреждает «не удалось» с помощью следующего простого теста:

(function(){
 var checkChar = function(txt){
 var regex = /^(\w{1,})\1\s\w{1,}((?:\s\w{1,})?)+\s+&\s+\w{1,}\s(((?:\s\w{1,})?)+)\1$/;

  (regex.test(txt)) ? alert('passed') : alert('failed');

 }

 checkChar("GARNSEY B R & D B GARNSEY");
})()

Неужели я неправильно понимаю цель \ 1 и есть ли какое-либо решение сделать то, что я пытаюсь сделать, используя регулярное выражение, как показано выше? Спасибо за ответ.

Ответы [ 2 ]

1 голос
/ 13 января 2011

Удалите \ 1 в начале регулярного выражения.После этого он все равно не будет сообщать о прохождении, но это, вероятно, какая-то другая ошибка в вашем regexpr.Я попытался упростить ваш код, чтобы сделать более или менее то же самое:

(function(){
 var checkChar = function(txt){
var regex = /^(\w+)(\s\w+)+\s+&\s+(\w+\s)+\1$/;

  (regex.test(txt)) ? alert('passed') : alert('failed');

 }

 checkChar("GARNSEY B R & D B GARNSEY");
})()
1 голос
/ 13 января 2011

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

var re = /^(\w+)\b.+\b\1$/;
re.test( "GARNSEY B R & D B GARNSEY" ); // true
re.test( "GARNSEY B R & D GARNSEY" );   // true
re.test( "GARNSEY B R & D GURNSEY" );   // false
re.test( "GARNSEY B R & D ZGARNSEY" );  // false
...