【问题标题】:Regular expression to match a word or its prefix匹配单词或其前缀的正则表达式
【发布时间】:2013-08-26 11:32:09
【问题描述】:

我想匹配整个单词的正则表达式。

在下面的示例中,我尝试匹配 sseason,但我的匹配 seaon

[s|season]

如何使正则表达式匹配整个单词?

【问题讨论】:

  • 请改用(season|s)[season] 匹配任何s,e,a,o,n

标签: regex expression word


【解决方案1】:

使用这个实时在线示例来测试您的模式:

以上截图来自这个现场示例:https://regex101.com/r/cU5lC2/1

匹配命令行中的任何整个单词。

我将在Ubuntu 12.10 上使用phpsh interactive shell 通过称为preg_match 的方法演示PCRE regex engine

启动phpsh,将一些内容放入变量中,匹配word。

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

preg_match 方法使用 PHP 语言中的 PCRE 引擎来分析变量:$content1$content2$content3 以及 (\w)+ 模式。

$content1 和 $content2 至少包含一个单词,$content3 不包含。

在没有单词边界的情况下匹配命令行上的特定单词

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(dart|fart)', $gun1);
1

php> echo preg_match('(dart|fart)', $gun2);
1

php> echo preg_match('(dart|fart)', $gun3);
1

php> echo preg_match('(dart|fart)', $gun4);
0

变量gun1gun2 包含字符串dartfart 是正确的,但是gun3 包含darty 并且仍然匹配,这就是问题所在。所以进入下一个例子。

将命令行中的特定单词与单词边界匹配:

字边界可以与\b 强制匹配,参见:

http://jex.im/regulexhttps://github.com/JexCheng/regulex 获取的正则表达式视觉图像示例:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

\b 断言我们有一个单词边界,确保匹配“dart”,但不匹配“darty”。

【讨论】:

  • 赞成,因为我需要 \b 字符,但我不知道!
  • 为什么这个详尽的解释不是答案?
  • 因为发布问题的人选择了第一个出现的答案,并且当我的非常优秀的答案随后出现时,并没有费心切换到我的答案。您可以通过问题下方的评论询问提问者,将他们的答案选择更改为这个,这将提高此页面对登陆它的人的价值。
  • 我投了赞成票,因为你在你的例子中使用了“放屁”这个词......我需要 \w+ ;)
【解决方案2】:

方括号用于字符类,您实际上是在尝试匹配以下任何一个:s|s(再次)、eas(再次),on

使用括号代替分组:

(s|season)

或非捕获组:

(?:s|season)

注意:非捕获组告诉引擎它不需要存储匹配项,而另一个(捕获组需要)。对于小东西,无论是工作,对于“重型”的东西,你可能想先看看你是否需要匹配。如果你不这样做,最好使用非捕获组来分配更多内存用于计算,而不是存储你永远不需要使用的东西。

【讨论】:

  • 是的,我已经意识到了。非捕获是我需要的。我认为使用 () 将始终匹配,知道有一个不匹配的选项很方便,谢谢。
  • 你误会了。分组中的?: 又名non-capturing 只是说,您不能将匹配的表达式与$1$2 等一起使用...如果您希望表达式不匹配,您需要什么是^
  • @NMGodA1b2c3d4 不客气!您的意思是不匹配或不捕获的选项(有区别,是的)。如果您不想匹配其中任何一个,您将使用(?! ... ) insead,在这种情况下表示(?!s|season)
【解决方案3】:

我在 js 中测试示例。 最简单的解决方案 - 只需在 / / 中添加您需要的单词:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

现在,如果您需要这个带有边界的特定单词,而不是在任何其他符号字母内。我们使用 b 标记:

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

我们在 js 中也有 exec() 方法,它返回 object-result。它有助于 f.g.获取有关我们单词的位置/索引的信息。

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

如果我们需要获取字符串/句子/文本中所有匹配的单词,我们可以使用 g 修饰符(全局匹配):

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

现在是最后一个 - 我不需要 1 个特定的词,但其中一些。我们使用 |符号,表示选择/或。

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

【讨论】:

    【解决方案4】:

    [ ] 定义了一个字符类。所以你在那里设置的每个字符都会匹配。 [012] 将匹配 012[0-2] 行为相同。

    你想要的是分组来定义一个 or 语句。使用(s|season) 处理您的问题。

    顺便说一句。你必须小心。普通正则表达式(或分组内)中的元字符与字符类不同。字符类就像子语言。 [$A] 只会匹配 $A,仅此而已。不要为了美元而逃跑。

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多