0

请注意这些文本字符串如何两次声明了单词“GARNSEY”:

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

现在它可以是 D GARNSEY(无中间名首字母)或 DB GARNSEY(包括中间名首字母),但我需要知道是否提到了 GARNEY,因为这意味着姓氏被提及两次,一次在开头,一次在结尾。

根据 JavaScript Programmer's Reference 一书:

“您可以在整个模式中重复搜索该确切符号......您可以使用 \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 的目的,是否有任何解决方案可以使用正则表达式来做我想做的事情,如上所示?感谢您的回复。

4

2 回答 2

1

此正则表达式将测试是否有名称,后跟任意数量的垃圾,以相同的名称结尾:

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
于 2011-01-13T16:53:06.653 回答
1

删除正则表达式开头的 \1。之后它仍然不会报告通过,但这可能是您的正则表达式中的其他一些错误。我试图简化您的代码以或多或少地做同样的事情:

(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");
})()
于 2011-01-13T16:58:07.300 回答