【问题标题】:Regex to match a word, even is there are spaces between letters正则表达式匹配一个单词,即使字母之间有空格
【发布时间】:2015-03-31 07:54:20
【问题描述】:

我想要一个正则表达式来匹配一个单词,即使字符之间有空格。 当我想匹配单词test时,它应该匹配以下内容:

test t est t e s t

等等,但它不应该匹配这样的东西:

tste te ts s tet

我有这个正则表达式: (t[\s]*e[\s]*s[\s]*t[\s]*) 但我不相信这个效率很高。

【问题讨论】:

  • 删除字符类。

标签: php regex preg-replace preg-match preg-match-all


【解决方案1】:

这是匹配此类单词的唯一方法。您必须消耗这些空间,否则您将无法匹配。其实你的模式是一样的

t\s*e\s*s\s*t

如果单词出现在较大的字符串中,可以考虑使用单词边界版本:

\bt\s*e\s*s\s*t\b

注意:如果每个字母之间只允许一个空格,您可以使用? 量词代替*

t\s?e\s?s\s?t

【讨论】:

  • 所以没有更好的方法来做到这一点?
  • 好吧,你可以在匹配之前用空字符串替换所有空格。但是你会失去单词边界。
  • 好吧,我希望有一些更短更高效的东西。比我必须采用这个解决方案。
【解决方案2】:

为什么不从输入中删除所有水平空格,然后匹配正则表达式:

$input = 't e s t';
$regex = '/\btest\b/i';

preg_match($regex, preg_replace('/\h+/', '', $input), $m);

【讨论】:

  • 在某些情况下这是可以接受的解决方案,但如果您必须知道匹配的长度怎么办。例如test me for length 必须返回 'test' sou 你可以知道匹配长度是 4 但t e s t me for length 必须返回 't e s t' 所以你可以知道长度是 7。如果删除空格,你会丢失该信息,你只能测试你的搜索字符串存在,但你不能对匹配进行长度计算,因为两者都是 4。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2011-10-15
相关资源
最近更新 更多