术语之前或之后没有字母数字字符的术语

时间:2011-01-14 16:34:37

标签: regex

我正在尝试编写一个匹配指定单词的所有匹配项的正则表达式,但不能包含前缀或后缀的任何字母数字字符。

例如,搜索术语“cat”不应返回“催化剂”这样的术语。

这是我到目前为止所做的:

"?<!([a-Z0-9])*?TERMPLACEHOLDER?!([a-Z0-9])*?"

这应该单独返回“TERMPLACEHOLDER”这个词。

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:5)

怎么样:

\bTERMPLACEHOLDER\b

答案 1 :(得分:1)

您可以使用字词边界:\bTERMPLACEHOLDER\b

Javascript中的快速测试:

var a = "this cat is not a catalyst";

console.log(a.match(/\bcat\b/));

只返回“cat”。

答案 2 :(得分:1)

您可能正在寻找word boundaries。从那里,如果你想让它与部分匹配,你可以在单词的任一侧使用\w*?之类的通配符

Search for any word containing "MYWORD"
\b\w*?MYWORD\w*?\b

Search for any word ending in "ING"
\b\w*?ING\b

Search for any word starting with "TH"
\bTH\w*?\b

答案 3 :(得分:0)

小心当你说“word”引用你想要找到的子字符串时。在正则表达方面,“单词”具有不同的含义,它是一个字符类。

定义您想要找到的'文字'字符串(不是单词)。这可以是任何东西,句子,标点符号,换行符组合。示例“找到此\完全短语&lt;&gt;!abc” 由于这将成为正则表达式的一部分(而不是整个正则表达式),因此可以转义可能嵌入的特殊正则表达式元字符。

string = 'foo.bar'  // the string you want to find
string =~ s/[.*+?|()\[\]{}^\$\\]/\\$&/g  // Escape metachars

现在'literal'字符串已准备好插入到正则表达式中。请注意,如果您想单独允许类或想要字符串中的元字符,您必须自己逃避。

sample =~ /(?<![^\W_])$string(?![^\W_])/ig  // Find the string globally
(expanded)
/ 
  (?<![^\W_])    # assertion: No alphanumeric character behind us
  $string        # the 'string' we want to find
  (?![^\W_])     # assertion: No alphanumeric character in front of us
/ig

Perl样本 -

use strict;
use warnings;

my $string = 'foo.bar';
my $sample = 'foo.bar and !fooAbar and afoo.bar.foo.bar';

# Quote string metacharacters

  $string =~ s/[.*+?|()\[\]{}^\$\\]/\\$&/g;

# Globally find the string in the sample target

  while ( $sample =~ /(?<![^\W_])$string(?![^\W_])/ig )
  {
      print substr($sample, 0, $-[0]), "-->'",
            substr($sample, $-[0], $+[0] - $-[0]), "'\n";
  }

输出 -

-->'foo.bar'
foo.bar and !fooAbar and afoo.bar.-->'foo.bar'