正则表达式找到一个词而不是另一个词

时间:2011-10-20 17:33:36

标签: regex

如何仅使用正则表达式检测字符串是否包含例如我的名字而不是我的姓氏?

3 个答案:

答案 0 :(得分:4)

使用正则表达式的最简单方法是使用简单的正则表达式和逻辑连接符。由于您只需要简单的匹配,并且因为您没有列出语言,所以这是Perl中的基本实现:

my $str1="firstname lastname blah blah blah";
my $str2="blurg firstname etc";

foreach($str1,$str2)
{
  if(/firstname/ and !/lastname/)
  {
    print "$_ matched firstname and not lastname!\n";
  }
  else
  {
    print "No match for $_\n";
  }
}

正如所料,输出是:

No match for firstname lastname blah blah blah
blurg firstname etc matched firstname and not lastname!

答案 1 :(得分:1)

^(?=.*firstname)(?=.*lastname)

有许多正则表达式版本,你可以做这样的事情。我使用零宽度前瞻来搜索你的名字和你的姓氏。它们不会“移动”正则表达式光标,因此从第一个字符开始扫描它们。如果不存在名字或姓氏,则正则表达式将失败。

说真的,正则表达式应该更复杂,否则你可能会遇到以下情况:

firstname = `name`
lastname = `lastname`

lastname // ok with the given rules

firstname = `firstname`
lastname = `lastname`

firstnamelastname // ok with the given rules, even without the space
xfirstnamex xlastnamex // ok with the given rules

正则表达式需要:

^(.*\bfirstname\b.*\blastname\b)|(.*\blastname\b.*\bfirstname\b)

检查firstname和lastname的命令,并检查firstname和lastname之前和之后是否有单词分隔符。

我要补充一点,我所展示的是不做的完美例子。你想用户正则表达式?你没有!首先,您尝试使用您的语言的字符串函数。然后,如果他们失败了,你可以尝试使用正则表达式。

答案 2 :(得分:1)

怎么样:

#!/usr/bin/perl
use Modern::Perl;

while (<DATA>) {
    chomp;
    say /^(?=.*\bfirstname\b)(?!.*\blastname\b)/ ? "OK : $_" : "KO : $_";
}

__DATA__
jhjg firstname jkhkjh lastname kljh
jhgj lastname kjhjk  firstname kjhkjh
jhgdf firstname sjhdfg not_my_lastname
jshgdf no_my_lastname jhg firstname jkhghg

<强>输出:

KO : jhjg firstname jkhkjh lastname kljh
KO : jhgj lastname kjhjk  firstname kjhkjh
OK : jhgdf firstname sjhdfg not_my_lastname
OK : jshgdf no_my_lastname jhg firstname jkhghg